我正在寻找一种可靠的方法来构建< Type>的控件列表包含在特定< Panel>中的衍生控制 - 包括直接儿童,儿童等等。
最明显的方法是递归地执行:
添加以列出< Type>的此控件的所有子项,然后对该控件的任何子项重复函数,该控件是< Panel>或后代。
但是我担心这不会在树中找到所有控件 - 任何ContentControl也可能包含< Type>的控件,HeaderedContentControl或具有一个或多个子/内容属性的任何其他类似控件也是如此
是否有任何方法可以对实际布局树执行搜索,以便可以找到包含在没有特定父级的特定控件类型的任何实例?
答案 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开头并具有包含组合框的嵌套网格,堆栈面板,画布等
Imports System.Windows.Controls.Primitives
(或用于C#)Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)
就是这样......