7

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

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

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

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

4

2 回答 2

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>();
于 2009-11-23T17:48:39.543 回答
1

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

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

就是这样...

于 2012-08-01T14:06:38.493 回答