C# WPF中TabControl在SelectionChanged上的奇怪行为
我做了一个TabControl,里面有三个TabItems。我的代码如下所示: XAML: 当我更改TabItem时,会弹出一个带有文本的MessageBox,如预期的那样。但当我现在单击另一个项目时,我会得到下一个项目的MessageBox,然后是上一个项目的MessageBox。我不能完全确定这背后的逻辑。 当我删除MessageBox时,一切正常,但我需要它们,因为我想在以后实现一些逻辑C# WPF中TabControl在SelectionChanged上的奇怪行为,c#,wpf,tabcontrol,messagebox,tabitem,C#,Wpf,Tabcontrol,Messagebox,Tabitem,我做了一个TabControl,里面有三个TabItems。我的代码如下所示: XAML: 当我更改TabItem时,会弹出一个带有文本的MessageBox,如预期的那样。但当我现在单击另一个项目时,我会得到下一个项目的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);
}
}
}