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

Dav*_*vid 7 .net silverlight controls children silverlight-3.0

我正在寻找一种可靠的方法来构建一个包含在特定<Panel>派生控件中的<Type>控件列表 - 这包括那些直接子节点,以及那些是子节点的子节点等等.

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

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

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

Ant*_*nes 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;
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

这种方法确实有缺点,它假设树成员资格在进行中没有发生变化.这可以通过使用ToList()来减轻使用.

现在,您可以使用LINQ实现您的要求: -

 var qryAllButtons = myPanel.Descendents().OfType<Button>();
Run Code Online (Sandbox Code Playgroud)