2016-06-07 28 views
2

我們試圖阻止用戶離開TabItem,直到滿足條件。 我在LostFocus上實施了代碼,但它持續不斷地發射。我已嘗試退訂該活動,然後在設置TabItem重點後再次訂閱。我也嘗試設置TabItemIsSelected真實但仍然沒有這些工作。WPF強制用戶留在TabItem上

private void dataTab_LostFocus(object sender, RoutedEventArgs e) 
{ 
    var result = MessageBox.Show("Do you want to proceed?", "No Option chosen", MessageBoxButton.YesNo, MessageBoxImage.Question); 
      if (result == MessageBoxResult.Yes) 
       NextTab.Focus(); 
      else { 
       dataTab.LostFocus -= dataTab_LostFocus; 
       dataTab.IsSelected = true; 
       //Also tried dataTab.Focus(); 
       //e.Handled = true; Also tried. 

       dataTab.LostFocus +=dataTab_LostFocus; 
      } 
} 
+0

我們可以看看實現的代碼(和xaml)嗎? 「持續不斷地開火」可以通過多種方式解決,但是如果沒有看到你的嘗試,很難猜測出什麼問題。 – Sinatr

+0

看到這個:https://joshsmithonwpf.wordpress.com/2009/09/04/how-to-prevent-a-tabitem-from-being-selected/ – PaulF

+1

真的,所以你打電話給NextTab.Focus();並想知道爲什麼要調用dataTab_LostFocus? – Paparazzi

回答

1

LostFocus是一個錯誤的情況下,你必須使用的TabControlSelectionChanged以防止標籤切換。

下面是一個工作解決方案(沒有MVVM邏輯可能看起來模糊)。問題是缺少SelectionChanging事件(在SelectedItem更改之前),所以您必須自己記住先前選擇的項目。

XAML:

<TabControl x:Name="tabControl" SelectionChanged="TabControl_SelectionChanged"> 
    <TabItem x:Name="dataTab" Header="1" /> <!-- the tab with confirmation --> 
    <TabItem Header="2" /> 
    <TabItem Header="3" /> 
</TabControl> 

CS:

object _previous; 
void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    var isPreviousWasDataTab = _previous == dataTab; 
    _previous = tabControl.SelectedItem; // store SelectedItem for next event 
    if (isPreviousWasDataTab && MessageBox.Show("", "", MessageBoxButton.YesNo) != MessageBoxResult.Yes) 
     _previous = tabControl.SelectedItem = dataTab; 
} 

最後行可能需要一些解釋:

  1. SelectedItem = dataTab將上升SelectionChanged事件;
  2. TabControl_SelectionChanged()將被調用;
  3. 在呼叫isPreviousWasDataTab == false,因此沒有什麼有趣的事情發生;
  4. 返回時我們設置_previous = dataTab
+0

作品,謝謝。解釋是沒有必要的,但無論如何感謝。 – zulq

1

將事件hanlder連接到Tabcontrol的選擇已更改事件。

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e){ 
//do your filtering here, and set tab control item to the one you want.