2011-08-22 26 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

相關問題