【发布时间】:2010-12-19 13:18:10
【问题描述】:
我正在寻找一种可靠的方法来构建包含在特定
最明显的方法是递归地执行它:
添加以列出
但是我担心这不会在树中找到所有控件 - 任何 ContentControl 也可以包含
是否有任何方法可以对实际的布局树执行搜索,以便可以找到包含的特定类型控件的任何实例,但没有特定的父级?
【问题讨论】:
标签: .net silverlight controls silverlight-3.0 children
我正在寻找一种可靠的方法来构建包含在特定
最明显的方法是递归地执行它:
添加以列出
但是我担心这不会在树中找到所有控件 - 任何 ContentControl 也可以包含
是否有任何方法可以对实际的布局树执行搜索,以便可以找到包含的特定类型控件的任何实例,但没有特定的父级?
【问题讨论】:
标签: .net silverlight controls silverlight-3.0 children
这是一个相当幼稚的扩展方法:-
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>();
【讨论】:
假设您想在 userControl 中查找组合框,该 userControl 以 GRID 开头,并具有包含组合框的嵌套网格、堆栈面板、画布等
Imports System.Windows.Controls.Primitives(或用于 C#)Dim ListOfComboBoxes = MAINGRID.GetVisualDescendants.OfType(Of ComboBox)就是这样……