0

我遇到了一个非常奇怪的问题:在 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 中:

    private int m_selectedTabIndex;
    public int SelectedTabIndex
    {
        get
        { return m_selectedTabIndex; }
        set
        {
            SetAndNotify(ref m_selectedTabIndex, value, () => SelectedTabIndex);
            SelectedTabChanged();
        }
    }

private void SelectedTabChanged()
    {
        // Some code
    }

如您所见,每次我的 viewModel 的SelectedTabIndex属性发生更改时,SelectedTabChanged()都会执行该方法,这非常有效。

我奇怪的问题是:当我使用例如System.Windows.MessageBox.Show("Some Text")在我的SelectedTabChanged()方法中显示一条消息时,我选择了另一个 tabItem 并且之前选择的选项卡被阻止,它看起来像被选中,但它仍然被永久选中,我再也看不到它的内容了。

澄清一下:正如我之前所说,这个奇怪的问题只在显示模式窗口时发生

为什么会发生?我该如何解决这个问题?

我希望我能清楚地解释自己。

先感谢您。

4

2 回答 2

2

我已经解决了我的问题。由于我是 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);

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

于 2012-06-19T17:22:22.157 回答
0

我不是 100% 确定我理解你的问题,但是MessageBox.Show会产生一个嵌套的消息泵并阻止 main Dispatcher,从而“冻结”主窗口(这就是它是模态的原因)。如果您需要在MessageBox不显示模式的情况下显示样式警报,那么我的建议是创建一个面板,其中包含您的消息,该面板以TabItem隐藏的可见性存在,然后在需要显示消息时使其可见。您的选项卡选择在这种情况下仍应有效

于 2012-06-19T15:44:35.683 回答