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

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

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

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

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

【问题讨论】:

    标签: .net silverlight controls silverlight-3.0 children


    【解决方案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 开头,并具有包含组合框的嵌套网格、堆栈面板、画布等

    1. Imports System.Windows.Controls.Primitives(或用于 C#)
    2. 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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多