【问题标题】:Finding Controls of the Same Type查找相同类型的控件
【发布时间】:2010-06-28 16:16:46
【问题描述】:

有没有人有办法找到同一类型对象中的所有控件?这是我的场景,我有一个选项卡控件,并且在每个选项卡控件中都存在一个用户控件(所有这些控件都匹配相同的基本类型,例如 MyBaseClassControl)。我希望能够找到该用户控件而不必使用 control.FindName("controlName") 方法,而是希望按类型(例如基类)获取控件的句柄。 VisualTreeHelper 类似乎对我没有任何作用,因为它只返回本机 Silverlight 对象。

【问题讨论】:

    标签: silverlight controls


    【解决方案1】:

    鉴于此:

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

    【讨论】:

    • 奇怪的是,这个扩展方法永远不会返回我的自定义基类型。 VisualTreeHelper 中的“GetChildren”方法是递归的吗?我忘了提到我要查找的控件包含在 Grid 中。
    • 应该可以工作,尽管效率非常低。 Union 需要跟踪的对象在输出中不包含多次,在这种情况下这是不必要的,孩子被放置在 List&lt;T&gt; 中(也是不必要的),所有这些都是递归完成的,在深度嵌套的对象上树大大增加了所有这一切的成本。
    • 同意,如果性能成为问题,这可以而且应该进行优化。出于问题的目的-例如如何按类型查找控件 - 这确实演示了它。
    猜你喜欢
    • 2014-11-27
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多