微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

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

解决方法

这是一个相当天真的扩展方法: –

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐