2010-09-05 88 views
1

後,我曾與WPF-的TabControl所選擇的項目,可以用下面簡單的代碼被複制了一個問題:WPF的TabControl的SelectedItem重置窗口已經關閉

如果創建了一個新的TabItem,並通過點擊選擇 - 第二個窗口中的按鈕事件,選項卡被創建,添加和選擇。當第二個窗口關閉時,選項卡控件的選定項目重置爲最後選擇的項目。這個問題發生在我的MVVM-app中,它獨立於Items-collection。我可以使用ItemsSource或Items-Collection,它總是發生。

有人知道這裏發生了什麼,或有一個很好的解決方法?

TabControl tabControl = new TabControl() ; 
tabControl.Items.Add(new TabItem { Header="InitialTabItem"}); 
((TabItem)tabControl.Items[0]).Focus(); 
Window mainWindow = new Window() { Content=tabControl,Title="TabControl-Window"}; 
mainWindow.Show();    
Button addButton = new Button() { Content="AddTabItem"}; 
addButton.Click += (o, e) => { 
     TabItem newTabItem=new TabItem(){Header=DateTime.Now.ToLongTimeString()}; 
     tabControl.Items.Add(newTabItem);     
     tabControl.SelectedItem = newTabItem;     
}; 
Window directorWindow = new Window() { Owner = mainWindow ,Content=addButton,Height=80,Width=200,Title="DirectorWindow"}; 
directorWindow.Show(); 

更新

這似乎是一如既往,當我有更大的問題與WPF,是一個問題與focus-management。如果我更改創建代碼如下,它的工作原理:

TabItem newTabItem=new TabItem(){Header=DateTime.Now.ToLongTimeString()}; 
tabControl.Items.Add(newTabItem);      
Dispatcher.BeginInvoke(new Action(delegate{ 
    newTabItem.Focus(); 
    tabControl.SelectedItem = newTabItem; 
}), System.Windows.Threading.DispatcherPriority.Input, null); 

但它看起來不是很自信地對我。一些想法?

+0

您是否真的使用MVVM模式?因爲你正在創建所有這些標籤uisng代碼。爲什麼不考慮使用綁定到TabControl的ItemSource屬性的可觀察集合, – TalentTuner 2010-09-05 17:25:24

+0

@saurabh:它的演示代碼來重現錯誤。真正的應用程序與ViewModel一起工作,該ViewModel提供了Tab項的ItemsSource以及SelectedTabItem屬性。但我不喜歡張貼大量的代碼示例。沒有人喜歡研究巨大的代碼塊來看到一個簡單的問題。正如我寫的,如果我使用Items或ItemsSource屬性沒有區別。這是一個普遍的問題,可以通過上面的代碼進行復制。 – HCL 2010-09-05 17:29:30

回答

1

是的,TabControl有時會表現奇怪。在我們的項目中,我們必須創建一個子類並重寫一些方法來解決其中的另一個錯誤。

在你的情況,似乎一切,如果你專注於TabControl本身工作聚焦TabItem前:

 var tabControl = new TabControl(); 
     var tabItem = new TabItem { Header = "InitialTabItem" }; 
     tabControl.Items.Add(tabItem); 
     tabControl.Focus(); 
     tabItem.Focus(); 
     Window mainWindow = new Window() { Content = tabControl, Title = "TabControl-Window" }; 
     mainWindow.Show(); 
     Button addButton = new Button() { Content = "AddTabItem" }; 
     addButton.Click += (o, args) => 
     { 
      TabItem newTabItem = new TabItem() { Header = DateTime.Now.ToLongTimeString() }; 
      tabControl.Items.Add(newTabItem); 
      tabControl.SelectedItem = newTabItem; 
     }; 
     Window directorWindow = new Window() { Owner = mainWindow, Content = addButton, Height = 80, Width = 200, Title = "DirectorWindow" }; 
     directorWindow.Show(); 

更新1.看評論 - 原代碼會導致不良的副作用。

 var tabControl = new TabControl(); 
     var tabItem = new TabItem { Header = "InitialTabItem" }; 
     tabControl.Items.Add(tabItem); 
     Window mainWindow = new Window() { Content = tabControl, Title = "TabControl-Window" }; 
     mainWindow.Show(); 
     tabControl.Focus(); 
     tabItem.Focus(); 
     Button addButton = new Button() { Content = "AddTabItem" }; 
     addButton.Click += (o, args) => 
     { 
      TabItem newTabItem = new TabItem() { Header = DateTime.Now.ToLongTimeString() }; 
      tabControl.Items.Add(newTabItem); 
      tabControl.SelectedItem = newTabItem; 
     }; 
     Window directorWindow = new Window() { Owner = mainWindow, Content = addButton, Height = 80, Width = 200, Title = "DirectorWindow" }; 
     directorWindow.Show(); 
+0

+1你說得對,在我的演示項目中這確實有幫助。我會稍後在真實應用程序中嘗試(我必須先完成其他任務)。你知道它爲什麼這樣嗎? – HCL 2010-09-05 14:02:50

+0

我想,因爲沒有人在微軟證實了這種情況,並且Focus()本身的邏輯如此複雜,所以沒有人能夠通過代碼審查驗證其對所有可能情況的正確性? – 2010-09-05 14:44:26

+0

@Yacoder:壞消息。我在真實應用程序中測試瞭解決方法 - 它解決了主要問題,但是在關閉窗口後,焦點管理變得瘋狂。其中一個結果是TreeViewItems不再可選。看來我在這裏發現了一個重大問題。非常感謝您的回答。是一個好的解決方案。我會尋找另一種解決方法。 – HCL 2010-09-05 19:23:10

1

請參閱使用演示代碼解決問題的Yacoders解決方案。然而,引導這個解決方案專注於我的真實項目。

似乎對我有用的一種方式就是我在更新中顯示的方式。如果有人遇到同樣的問題,請嘗試下面的代碼。到目前爲止,我還沒有看到任何副作用。

TabControl tabControl = new TabControl() ; 
tabControl.Items.Add(new TabItem { Header="InitialTabItem"}); 
((TabItem)tabControl.Items[0]).Focus(); 
Window mainWindow = new Window() { Content=tabControl,Title="TabControl-Window"}; 
mainWindow.Show();    
Button addButton = new Button() { Content="AddTabItem"}; 
addButton.Click += (o, e) => { 
    TabItem newTabItem=new TabItem(){Header=DateTime.Now.ToLongTimeString()}; 
    tabControl.Items.Add(newTabItem);      
    Dispatcher.BeginInvoke(new Action(delegate{ 
     newTabItem.Focus(); 
     tabControl.SelectedItem = newTabItem; 
    }), System.Windows.Threading.DispatcherPriority.Input, null); 
}; 
Window directorWindow = new Window() { Owner = mainWindow ,Content=addButton,Height=80,Width=200,Title="DirectorWindow"}; 
directorWindow.Show();