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 DataGrid 没有行的概念吗?怎么能拿到选中行的索引? DataGrid.SelectedIndex 返回的值是-1,要怎么拿?