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

时间:2009-11-23 16:41:53

标签: .net silverlight controls silverlight-3.0 children

我正在寻找一种可靠的方法来构建< Type>的控件列表包含在特定< Panel>中的衍生控制 - 包括直接儿童,儿童等等。

最明显的方法是递归地执行:
添加以列出< Type>的此控件的所有子项,然后对该控件的任何子项重复函数,该控件是< Panel>或后代。

但是我担心这不会在树中找到所有控件 - 任何ContentControl也可能包含< Type>的控件,HeaderedContentControl或具有一个或多个子/内容属性的任何其他类似控件也是如此

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

2 个答案:

答案 0 :(得分:20)

这是一种相当天真的扩展方法: -

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>();

答案 1 :(得分:1)

假设您要在userControl中找到组合框,该组合框以GRID开头并具有包含组合框的嵌套网格,堆栈面板,画布等

  1. Imports System.Windows.Controls.Primitives(或用于C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)
  3. 就是这样......