2011-08-22 21 views
2

我想获得给定页面上给定类型的所有控件的列表,但我遇到了问题。看来,VisualTreeHelper可能只会返回已加载的控件?我试图关闭虚拟化,但这似乎没有帮助。任何人都可以想出另一种方式来获得所有的控制,或者可能强制加载UI,以便下面的方法起作用吗?WPF - 获取页面上给定类型的所有控件的集合?

我借这个从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; 
        } 
       } 
      } 
     } 
+0

是否使用'FlowDocuments ''等'在'页面? –

+0

没有。只是一系列UIElements。我遇到的真正问题是从我的TabControl获取特定的控件。只有第一个TabItem似乎返回任何东西。我假设在页面的Load事件期间调用代码时出现虚拟化问题,并且只有第一个TabItem是“可见的”。 –

+0

我怀疑'TabControl'可能会重复使用'TabItem'模板,只是在切换标签页时更改其内容。如果您更改标签,是否还有另一套控件? –

回答

10

请参考以下主题:Finding all controls of a given type across a TabControl

陶亮答案是一个很好的解释

的原因是WPF设计者想要优化TabControl的性能 。假设有5个TabItems,并且每个TabItem包含很多子节点。如果WPF程序必须构建和渲染所有的孩子,它将会非常缓慢。但是,如果TabControl仅处理当前选定的TabItem中的 子项,则将保存大量内存 。

您可以改为尝试逻辑树。
下面是这方面的一个示例实现,看看它是否工作更好地为您

使用它这样的..

List<Button> buttons = GetLogicalChildCollection<Button>(yourPage); 

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); 
     } 
    } 
} 
+1

太棒了!奇迹般有效。谢谢。 –

+2

'yourpage'的价值是什么?我想访问当前窗口中的所有按钮。 – Dramorian

相关问题