2016-06-07 26 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.