WPF SelectedIndex 设置 TabControl 的问题

Posted

技术标签:

【中文标题】WPF SelectedIndex 设置 TabControl 的问题【英文标题】:WPF SelectedIndex set issue of 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 事件不会触发。

怎么了? 有解决办法吗?

【问题讨论】:

【参考方案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 事件上挂钩事件处理程序

【讨论】:

以上是关于WPF SelectedIndex 设置 TabControl 的问题的主要内容,如果未能解决你的问题,请参考以下文章

wpf datagrid 默认选择为最新的一行,不知道为啥设置不了

WPF 条件绑定。 Button.IsEnabled 到 SelectedIndex >= 0

WPF TabControl 隐藏标头

WPF DataGrid 没有行的概念吗?怎么能拿到选中行的索引? DataGrid.SelectedIndex 返回的值是-1,要怎么拿?

wpf下拉框 绑定怎么让他默认有选中项

DockPanel 中的 WPF4 TabControl/Grid 隐藏了 StatusBar