2009-11-23 70 views
7

我在寻找一种可靠的方法来构建<类型的控件列表>包含在特定的< Panel>派生控件 - 这包括那些直接的孩子,以及那些这是孩子的孩子等等。Silverlight:查找布局中的所有类型控件

最显而易见的方法是只是做递归:
添加到列表这个控制的<类型>的任何儿童,然后重复功能此控制这是一个<面板>或后代的任何子女。

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

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

回答

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

是的,效果很好。谢谢。 – Jonx 2011-09-29 07:03:52

+0

@AnthonyWJones当我使用后裔没有控制会为我反弹,我跟踪和VisualTreeHelper.GetChildrenCount(根)将返回0计数,为什么? – 2014-09-01 07:45:26

1

比方说,你想找到与网格开始,并有嵌套网格,stackpanels,帆布等含有组合框

一个用户控件中的组合框
  1. Imports System.Windows.Controls.Primitives(或使用关于C#)
  2. Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)

就是这样......

+0

'GetVisualDescendants'不在主要的Silverlight发行版AFAICT中。 (请注意,[MSDN]上没有简单的定义(http://google.com/search?q=GetVisualDescendants+site%3Amsdn.microsoft.com+-site%3Asocial.msdn.microsoft.com)。)'System.Windows.Controls .Toolkit' [似乎](http://stackoverflow.com/a/7442356/256431)是必需的。 – 2012-10-01 02:27:17

+0

System.Windows.Controls.Primitives是System.Windows.Controls在以下目录中的一部分:c:\ Program Files(x86)\ Microsoft SDKs \ Silverlight \ v5.0 \ Libraries \ Client \ System.Windows.Controls。 DLL。 – 2012-10-13 10:46:51