Silverlight:在布局中查找所有类型的控件
Posted
技术标签:
【中文标题】Silverlight:在布局中查找所有类型的控件【英文标题】:Silverlight: Find all controls of type in layout 【发布时间】:2010-12-19 13:18:10 【问题描述】:我正在寻找一种可靠的方法来构建包含在特定
最明显的方法是递归地执行它:
添加以列出
但是我担心这不会在树中找到所有控件 - 任何 ContentControl 也可以包含
是否有任何方法可以对实际的布局树执行搜索,以便可以找到包含的特定类型控件的任何实例,但没有特定的父级?
【问题讨论】:
【参考方案1】:这是一个相当幼稚的扩展方法:-
public static class VisualTreeEnumeration
public static IEnumerable<DependencyObject> Descendents(this DependencyObject root)
int count = VisualTreeHelper.GetChildrenCount(root);
for (int i=0; i < count; i++)
var child = VisualTreeHelper.GetChild(root, i);
yield return child;
foreach (var descendent in Descendents(child))
yield return descendent;
这种方法确实有一个缺点,即它假设在进行过程中树的成员资格没有发生任何变化。这可以通过使用 ToList() 来缓解。
现在您可以使用 LINQ 实现您的要求:-
var qryAllButtons = myPanel.Descendents().OfType<Button>();
【讨论】:
@AnthonyWJones 当我使用 Descendents 时,没有控制权会为我重新运行,我是 trace 并且 VisualTreeHelper.GetChildrenCount(root) 将返回 0 计数,为什么?【参考方案2】:假设您想在 userControl 中查找组合框,该 userControl 以 GRID 开头,并具有包含组合框的嵌套网格、堆栈面板、画布等
Imports System.Windows.Controls.Primitives
(或用于 C#)
Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)
就是这样……
【讨论】:
GetVisualDescendants
不在 Silverlight 主要分布 AFAICT 中。 (注意MSDN 没有简单的定义。)System.Windows.Controls.Toolkit
seems 是必需的。
System.Windows.Controls.Primitives 是 System.Windows.Controls 的一部分,位于以下目录:c:\Program Files (x86)\Microsoft SDKs\Silverlight\v5.0\Libraries\Client \System.Windows.Controls.dll。以上是关于Silverlight:在布局中查找所有类型的控件的主要内容,如果未能解决你的问题,请参考以下文章
将 FontFamily 应用于 Silverlight 4 Beta 中的所有控件
Expression Blend实例中文教程 - 布局控件快速入门Grid