WPF - 获取页面上给定类型的所有控件的集合?

Son*_*Boy 2 c# wpf controls find

我正在尝试获取给定页面上给定类型的所有控件的列表,但我遇到了问题.似乎VisualTreeHelper可能只返回已加载的控件?我尝试关闭虚拟化,但这似乎没有帮助.任何人都可以想到另一种方法来获得所有控制权或者强制加载UI以便以下方法有效吗?

我从MSDN借用了这个:

 public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
        {
            if (depObj != null)
            {
                for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                {
                    DependencyObject child = VisualTreeHelper.GetChild(depObj, i);

                    if (child != null && child is T)
                    {
                        yield return (T)child;
                    }

                    foreach (T childOfChild in FindVisualChildren<T>(child))
                    {
                        yield return childOfChild;
                    }
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)

Fre*_*lad 10

请参阅以下主题:在TabControl中查找给定类型的所有控件

陶良的回答是一个很好的解释

原因是WPF设计者想要优化TabControl的性能.假设有5个TabItem,每个TabItem包含很多子项.如果WPF程序必须构造并呈现所有子项,那么它将非常慢.但是,如果TabControl仅处理当前所选TabItem中的子项,则将保存大量内存.

您可以尝试使用逻辑树.
这是一个示例实现,看看它是否适合您

像这样用它..

List<Button> buttons = GetLogicalChildCollection<Button>(yourPage);
Run Code Online (Sandbox Code Playgroud)

GetLogicalChildCollection

public static List<T> GetLogicalChildCollection<T>(object parent) where T : DependencyObject
{
    List<T> logicalCollection = new List<T>();
    GetLogicalChildCollection(parent as DependencyObject, logicalCollection);
    return logicalCollection;
}
private static void GetLogicalChildCollection<T>(DependencyObject parent, List<T> logicalCollection) where T : DependencyObject
{
    IEnumerable children = LogicalTreeHelper.GetChildren(parent);
    foreach (object child in children)
    {
        if (child is DependencyObject)
        {
            DependencyObject depChild = child as DependencyObject;
            if (child is T)
            {
                logicalCollection.Add(child as T);
            }
            GetLogicalChildCollection(depChild, logicalCollection);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 'yourpage'的价值是什么?我想访问当前窗口中的所有按钮. (2认同)