Silverlight:在布局中查找所有类型的控件

Posted

技术标签:

【中文标题】Silverlight:在布局中查找所有类型的控件【英文标题】:Silverlight: Find all controls of type in layout 【发布时间】:2010-12-19 13:18:10 【问题描述】:

我正在寻找一种可靠的方法来构建包含在特定 派生控件中的 控件列表 - 这包括直接子控件和子控件的子控件等。

最明显的方法是递归地执行它: 添加以列出 的此控件的任何子项,然后对该控件的任何子项(即 或后代)重复函数。

但是我担心这不会在树中找到所有控件 - 任何 ContentControl 也可以包含 控件,就像 HeaderedContentControl 或具有一个或多个子/内容属性的任何其他类似控件一样。

是否有任何方法可以对实际的布局树执行搜索,以便可以找到包含的特定类型控件的任何实例,但没有特定的父级?

【问题讨论】:

【参考方案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 中的所有控件

如何布局 Silverlight 应用程序?

Expression Blend实例中文教程 - 布局控件快速入门Grid

Silverlight Xaml 覆盖控件的 IsEnabled 属性

在 Silverlight 中检测控件的焦点

Silverlight 业务应用程序初始化检查