2010-10-29 19 views
3

考慮三個選項卡已加載和渲染TabControl的,與選擇的選項卡幸福指數1(中間的一個):如何獲得新的視覺樹時,WPF的TabControl的SelectedItem改變

表1:有一個文本框

表2:有兩個文本框

標籤3:有三個文本框

如果我通過將selectedItem與VisualTreeHelper可視化樹遍歷,我將獲得的TabControl的孩子們在兩個文本框。

我想再次重複,當標籤選擇改變,進入了新的選項卡的控件。如果我切換到標籤索引2,我應該使用VisualTreeHelper找到三個文本框。

正常的解決辦法是訂閱選擇改變事件並辦理樹,以獲取新的顯示控制。問題是,在這個時候,視覺樹仍然有舊標籤,使得這種搜索毫無價值。

我該如何攔截顯示新TabItem的時刻並觸發我的搜索?

我創建監視特定用戶界面的所有輸入控件,即使它無論是ContentControl中的模板更改或TabControl的選擇的選項卡的變化而變化動態驗證引擎...我希望你得到的圖片。

任何想法?

+0

您能找到解決方案嗎?我面臨完全相同的問題 - 我需要迭代新Tab的控件,但VisualTreeHelper在SelectionChanged事件處理程序中顯示舊Tab的控件。 – digitguy 2012-12-08 09:39:36

回答

0

的TabControl的加載/卸載的項目,當你切換標籤,所以你應該能夠連接的TabItem上的Loaded事件的驗證。

+0

您確定TabControl加載/卸載它的項目,以便提高舊TabItem的Unloaded事件和新TabItem的加載事件?我嘗試了這一點,但Loaded/Unloaded事件從未在更改標籤頁上提出過。 – digitguy 2012-12-08 09:49:12

+0

@digitguy是否所有的'TabItems'共享相同的'ItemTemplate'?如果是這樣,它將重新使用現有的模板,而不是卸載並重新加載一個新的模板 – Rachel 2012-12-08 21:31:54

+0

沒有我沒有使用任何ItemTemplate。我有一個簡單的TabControl有兩個TabItems,每個都有自己的StackPanel和其中的幾個TextBoxes。 – digitguy 2012-12-09 10:05:29

1

一種解決方案是推遲訪問,直到標籤正在使用Dispatcher.BeginInvoke滿載:

private void TabControlSelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, 
           (Action)(() => 
           { 
            // access the new tab's visual tree here 
           })); 
} 

使用DispatcherPriority.Loaded意味着新的標籤將需要可視化樹被訪問之前加載。

相關問題