【问题标题】:WPF SelectedIndex set issue of TabControlWPF SelectedIndex 设置 TabControl 的问题
【发布时间】:2011-12-08 20:02:18
【问题描述】:

我有一个包含两个项目的 TabControl。

<TabControl x:Name="tab" SelectionChanged="TabControl_SelectionChanged">
    <TabItem Header="TabItem1">
    <Grid />
</TabItem>
<TabItem Header="TabItem2">
    <Grid />
</TabItem>
</TabControl>

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Debug.WriteLine("Selected Index: " + tab.SelectedIndex);

    if (tab.SelectedIndex == 1)
    {
        tab.SelectedIndex = 0;
    }
}

当点击第 2 项时,第 1 项具有焦点并在下方打印。

Selected Index: 1
Selected Index: 0

但重试单击第二个项目,没有输出! SelectionChanged 事件不会触发。

怎么了? 有解决办法吗?

【问题讨论】:

    标签: wpf tabcontrol selectedindex


    【解决方案1】:

    这是因为您正在更改 SelectedIndexChanged 事件中的 selectedIndex,该事件将以同步方式调用自身。而是尝试以像这样的异步方式将其放在 UI 调度程序上 -

    private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
       Debug.WriteLine("Selected Index: " + tab.SelectedIndex);
    
       if (tab.SelectedIndex == 1)
       {
          Application.Current.Dispatcher.BeginInvoke
              ((Action)delegate { tab.SelectedIndex = 0; }, DispatcherPriority.Render, null);
       }
    }
    

    它会给你想要的输出。

    【讨论】:

    • 感谢您的帮助。它运作良好。但是如果它下面有对话框,它就不起作用。 if (tab.SelectedIndex == 1) { MessageBox.Show("Hello"); ... } 怎么了?
    • 你把 MessageBox 放在 UI 调度器上了吗??
    • 有没有办法在 MVVM Viewmodel 中实现这一点?
    • 是的,您可以通过交互触发器将 SelectionChanged 事件绑定到 ViewModel 中的命令。
    【解决方案2】:

    如果你点击已经被选中的选项卡,现在没有选择变化了吗?
    所以不会触发 SelectionChanged 事件。

    您必须在 TabItem 的 Header 的 Click 事件上挂钩事件处理程序

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 2021-09-11
      • 2022-01-23
      • 2012-08-23
      • 2014-01-19
      • 2012-09-07
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多