2010-06-28 56 views
0

有没有人有一种很好的方法来查找同一类型的对象中的所有控件?这里是我的场景,我有一个选项卡控件,并且在每个选项卡控件中都存在一个用户控件(所有这些控件都匹配相同的基本类型,例如MyBaseClassControl)。我希望能够找到该用户控件,而不必使用control.FindName(“controlName”)方法,而是希望通过类型(例如基类)获得控件的句柄。 VisualTreeHelper类似乎对我无能为力,因为它只返回本地Silverlight对象。查找同一类型的控件

回答

0

有鉴于此:

public static IEnumerable<DependencyObject> AllChildren(this DependencyObject root) 
{ 
    var children = root.DirectChildren().ToList(); 
    return children.Union(children.SelectMany(o => o.AllChildren())); 
} 

public static IEnumerable<DependencyObject> DirectChildren(this DependencyObject parent) 
{ 
    var childCount = VisualTreeHelper.GetChildrenCount(parent); 
    for (var i = 0; i < childCount; i++) 
     yield return System.Windows.Media.VisualTreeHelper.GetChild(parent, i); 
} 

你可以这样做:

myObj.AllChildren().OfType<MyBaseClassControl>(); 
+0

奇怪的是这个扩展方法永远不会返回我的自定义基本类型。 VisualTreeHelper递归中的“GetChildren”方法?我忘了提及我正在寻找的控件包含在一个Grid中。 – user378212 2010-06-28 23:44:38

+0

应该工作,虽然严重效率低下。 'Union'需要跟踪的对象在输出中不会包含多次,在这种情况下是不必要的,孩子被放置在'List '(也是不必要的),并且所有这些都是递归地完成的,其中深度嵌套对象树大量增加了所有这些成本。 – AnthonyWJones 2010-06-29 12:36:31

+0

同意,如果性能成为问题,可以并应该优化。为了这个问题的目的 - 例如如何通过类型找到控件 - 尽管如此,它确实证明了它。 – 2010-06-29 18:50:01