C# TabItem被永久阻止

C# TabItem被永久阻止,c#,wpf,tabcontrol,tabitem,C#,Wpf,Tabcontrol,Tabitem,我遇到了一个非常奇怪的问题:在WPF中,我有一个包含3个tabItems的tabControl。我已经在“OneWayToSource”模式下将tabControl的SelectedIndex绑定到viewModel类中的属性 以下是XAML代码: <TabControl Name="mainTabControl" SelectedIndex="{Binding SelectedTabIndex, Mode=OneWayToSource}" > <TabIte

我遇到了一个非常奇怪的问题:在WPF中,我有一个包含3个tabItems的tabControl。我已经在“OneWayToSource”模式下将tabControl的SelectedIndex绑定到viewModel类中的属性

以下是XAML代码:

<TabControl Name="mainTabControl" SelectedIndex="{Binding SelectedTabIndex, Mode=OneWayToSource}"  >
        <TabItem Header="Tab 01" Name="tab01"> ... </TabItem>
        <TabItem Header="Tab 02" Name="tab02"> ... </TabItem>
        <TabItem Header="Tab 03" Name="tab03"> ... </TabItem>
</TabControl>
如您所见,每当我的viewModel的
SelectedTabIndex
属性更改时,就会执行
SelectedTabChanged()
方法,这非常有效

我奇怪的问题是:当我在我的
selectedtabchange()
方法中使用例如
System.Windows.MessageBox.show(“一些文本”)
显示消息时,我选择了另一个选项卡项,而上一个选中的选项卡被阻止,看起来像是选中的,但它始终保持选中状态,我再也看不到它的内容了。

只是澄清一下:正如我之前所说的,只有在显示模式窗口时才会出现这种奇怪的问题

为什么会这样?我如何解决这个问题

我希望我能解释清楚


提前谢谢。

我不能100%确定我是否理解您的问题,但是一个
消息框。Show
将产生一个嵌套的消息泵并阻止主
调度程序,从而“冻结”主窗口(这就是为什么它是模态的)。

如果您需要在不显示模式的情况下显示
消息框
样式的警报,那么我的建议是创建一个面板,其中包含您的消息,该面板存在于
选项卡项
中,具有隐藏的可见性,然后在需要显示消息时使其可见。在这种情况下,您的选项卡选择应该仍然有效

我已经解决了我的问题。由于我是WPF新手,我真的不明白为什么模态窗口会使选项卡被阻塞。但是我在搜索时发现Dispatcher类允许异步执行一个方法,该方法可以防止任何控件被阻塞

我更改了viewModel代码,如下所示:

public int SelectedTabIndex
    {
        get
        { return m_selectedTabIndex; }
        set
        {
            SetAndNotify(ref m_selectedTabIndex, value, () => SelectedTabIndex);
            Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SelectedTabChanged), null);
        }
    }
真正帮助我的是以下几点:

Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SelectedTabChanged), null);

希望这能帮助其他人遇到类似的问题。

谢谢你的回复,但实际上我需要显示一个模式窗口,因为它可能是异常消息,因此,我尝试在不阻塞选项卡的情况下显示任何模式窗口。如果它是模式的,它将阻塞选项卡控件,因此没有可能的解决方案
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(SelectedTabChanged), null);