C# WPF中TabControl在SelectionChanged上的奇怪行为

C# WPF中TabControl在SelectionChanged上的奇怪行为,c#,wpf,tabcontrol,messagebox,tabitem,C#,Wpf,Tabcontrol,Messagebox,Tabitem,我做了一个TabControl,里面有三个TabItems。我的代码如下所示: XAML: 当我更改TabItem时,会弹出一个带有文本的MessageBox,如预期的那样。但当我现在单击另一个项目时,我会得到下一个项目的MessageBox,然后是上一个项目的MessageBox。我不能完全确定这背后的逻辑。 当我删除MessageBox时,一切正常,但我需要它们,因为我想在以后实现一些逻辑 现在的问题是“我如何防止事件发生两次?” 好的,我找到了。MessageBox会中断更改事件,因此我们

我做了一个TabControl,里面有三个TabItems。我的代码如下所示:

XAML:

当我更改TabItem时,会弹出一个带有文本的MessageBox,如预期的那样。但当我现在单击另一个项目时,我会得到下一个项目的MessageBox,然后是上一个项目的MessageBox。我不能完全确定这背后的逻辑。 当我删除MessageBox时,一切正常,但我需要它们,因为我想在以后实现一些逻辑


现在的问题是“我如何防止事件发生两次?”

好的,我找到了。MessageBox会中断更改事件,因此我们必须使用其他方法。使用样式时,可以捕获选项卡项的更改事件:

XAML:


您是否尝试了一些不会中断切换选项卡过程的功能,例如
Debug.WriteLine(…)
,而不是
MessageBox.Show(…)
?是的-我也可以让它这样做,但只能使用事件处理程序中的MessageBox.Show。这听起来像是TabControl中的一个bug。我想你将a)报告此事,b)以其他方式处理你的事情。(你为什么不使用MVVM呢?)因为我不知道如何使用MVVM,而且我只有几周的时间来完成我的项目,所以我没有时间学习这么大的东西。
<TabControl Name="ConfigTabs" HorizontalAlignment="Left" VerticalAlignment="Top" SelectionChanged="TabControlSelectionChanged">
  <TabItem Header="Allgemeines">
    ...
  </TabItem>
  <TabItem Header="Monitorbelegung">
    ...
  </TabItem>
  <TabItem Header="Produkt-Konfigurationen">
    ...
  </TabItem>
</TabControl>
private void TabControlSelectionChanged(object sender, SelectionChangedEventArgs e)
{
  if (e.Source is TabControl && this.IsLoaded)
  {
    TabControl MyTabControl = (TabControl)sender;
    if (MyTabControl.SelectedIndex == 0)
    {
      MessageBox.Show("Allgemeines");
    }
    else if (MyTabControl.SelectedIndex == 1)
    {
      MessageBox.Show("Monitor");
    }
    else if (MyTabControl.SelectedIndex == 2)
    {
      MessageBox.Show("Configs");
    }
  }
}
    <TabControl Name="ConfigTabs" HorizontalAlignment="Left" VerticalAlignment="Top">
        <TabControl.Resources>
            <Style TargetType="TabItem">
                <EventSetter Event="Selector.Selected" Handler="OnNewTabSelected"/>
            </Style>
        </TabControl.Resources>
        <TabItem Header="Allgemeines">
        ...           

        </TabItem>
        <TabItem Header="Monitorbelegung">
        ...
        </TabItem>
        <TabItem Header="Produkt-Konfigurationen">
        ...
        </TabItem>
    </TabControl>
    private void OnNewTabSelected(object sender, RoutedEventArgs e)
    {
        if (e.Source is TabItem && this.IsLoaded)
        {
            TabItem MyTab = (TabItem)sender;
            TabControl MyControl = (TabControl)MyTab.Parent;
            if (MyControl.SelectedIndex == 0)
            {
                MessageBox.Show("Beep" + MyControl.SelectedIndex);
            }
            else if (MyControl.SelectedIndex == 1)
            {
                MessageBox.Show("Beep" + MyControl.SelectedIndex);
            }
            else if (MyControl.SelectedIndex == 2)
            {
                MessageBox.Show("Beep" + MyControl.SelectedIndex);
            }
        }
    }