gpt4 book ai didi

c# - TabControl- 防止用户更改选定的选项卡 : MessageBox causing bug

转载 作者:太空狗 更新时间:2023-10-29 23:17:50 25 4
gpt4 key购买 nike

我已经在这个问题上苦苦思索了一段时间,但只找到了部分解决方案。

我正在尝试设置一个 TabControl,以便在某些情况下可以防止用户更改当前选定的选项卡。当用户被阻止更改当前选择的选项卡时,他们会看到一个对话框。

我已经阅读了以下文档:

我已经实现了第 3 个链接中指示的解决方案(尽管以上所有内容都会产生如下所示的相同错误)。它有效,但是...

如果用户执行以下操作,事情将彻底困惑:

  • 尝试在不允许此类操作时更改选项卡。 MessageBox 弹出并显示错误。
  • 用户点击“确定”并返回到原始窗口。
  • 用户再次尝试更改选项卡。 没有出现 MessageBox。
  • 如果用户将窗口最小化,然后再次将其最大化,则应该出现的 MessageBox 会出现。
  • 用户单击“确定”并返回到原始窗口...但选项卡已更改为他们之前选择的选项卡,即使他们不应该更改选项卡

这显然不是理想的行为。 为什么 MessageBox 没有第二次出现,为什么选项卡在应该被禁止的情况下发生变化?

如果我删除 MessageBox 部分,它工作正常。

这是 TabControl.SelectionChanged 事件处理程序的代码:

bool _isChanging = false;

private void tabControlForNavigation_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (!_isChanging && canChangeTabs.IsChecked.HasValue)
{
_isChanging = true;


bool canLeave = canChangeTabs.IsChecked.Value; //normally this would be replaced by a check in the ViewModel

if (!canLeave)
{
int prevIndex = tabControlForNavigation.Items.IndexOf(tabControlForNavigation.SelectedContent);
tabControlForNavigation.SelectedIndex = prevIndex;
MessageBox.Show("Can't change tabs!"); //if I comment out this line, everything works fine.
}

_isChanging = false;
}
}

我正在使用 MVVM 来实现它。窗口看起来像这样:

<Window x:Class="TestTabControlSwitching.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="350"
Width="525">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<CheckBox x:Name="canChangeTabs"
Content="Can Change Tabs"
IsChecked="True" />
<TabControl x:Name="tabControlForNavigation"
Grid.Row="1"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Collection}"
SelectedItem="{Binding SelectedItem}"
SelectionChanged="tabControlForNavigation_SelectionChanged"
Margin="4"
HorizontalAlignment="Stretch">
<TabControl.ItemTemplate>
<DataTemplate>
<ContentPresenter Content="{Binding Path=Name}" />
</DataTemplate>
</TabControl.ItemTemplate>

</TabControl>
</Grid>

为了简洁起见,我省略了其余代码 - 有一个非常简单的 ViewModel 结构支持窗口。

最佳答案

如您所见,问题出在事件处理程序中的 MessageBox。焦点将更改为 MessageBox,您会得到各种不想要的效果。我自己也有这方面的问题。

这是关于同一主题的几个 SO 问题
WPF: Does MessageBox Break PreviewMouseDown?
Wpf stop routing event when MessageBox appear?

如果您必须向用户显示一条消息,那么另一种方法可能是创建一个新的 Window,您将其样式设置为 MessageBox,然后调用 Show (不是 ShowDialog)在事件处理程序中。

关于c# - TabControl- 防止用户更改选定的选项卡 : MessageBox causing bug,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7327036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com