我有一个带有TabControl的用户界面,该界面最初显示一个起始页。通过双击DataGrid等网格中的内容,可以向其中添加其他项。创建新选项卡时应选择这些选项卡。如果与网格中的项对应的文档已经打开,则应打开该文档的现有选项卡,而不是创建新选项卡。
我知道我应该能够通过设置TabControl的SelectedItem或SelectedIndex属性以编程方式选择选项卡。但是,所需的选项卡实际上从未激活。如果我设置了一个选项卡,然后在调试器中检查TabControl的状态,那么这两个字段似乎都正确更新了。但是,在继续执行之后,我看到选定的选项卡在UI中保持不变。和SelectedIndex已经返回到它们以前的值。另一方面,通过在UI中单击选项卡来选择选项卡就可以很好地工作。
下面是TabControl的声明:
<TabControl x:Name="Tabs" >
<TabItem x:Name="StartPageTab" Header="Start Page" DataContext="{Binding Path=StartPageViewModel}">
...
</TabItem>
</TabControl>
添加和选择选项卡的代码:
private void _SelectTab(MyViewModel model)
{
TabItem tab;
if (_TryFindTab(model, out tab)) Tabs.SelectedItem = tab;
}
private bool _TryFindTab(MyViewModel target, out TabItem tab)
{
foreach (TabItem item in Tabs.Items)
{
MyViewModel model = item.DataContext as MyViewModel;
if (model != null && model.Equals(target))
{
tab = item;
return true;
}
}
tab = null;
return false;
}
private void _AddTab(MyViewModel model)
{
TabItem tab = new TabItem { DataContext = model, Content = new MyView() };
Binding bind = new Binding { Source = model, Path = new PropertyPath("Name") };
tab.SetBinding(TabItem.HeaderProperty, bind);
Tabs.Items.Add(tab);
Tabs.SelectedItem = tab;
}
4条答案
按热度按时间zazmityj1#
它与我在最初的问题描述中忽略的一些东西有关:
所讨论的DataGrid位于StartPageTab的内容中。我通过以下方式处理该DataGrid上的双击:捕获其MouseDoubleClick事件,搜索可视树以查找双击了哪个DataGridRow(如果有),然后引发最终由主窗口捕获的事件,主窗口将通过调用_SelectTab或_AddTab(取决于所讨论的文档是否已经打开)来响应。
此时,调用堆栈将展开并返回到MouseDoubleClick事件处理程序。在该处理程序中,我忘记了将MouseButtonEventArgs的Handled属性设置为true。因此WPF一直在搜索其他人来处理该单击事件-而最终找到的元素将通过请求焦点来响应,这反过来意味着原始选项卡需要重新获得焦点。
添加
e.Handled = true;
阻止了整个混乱的轨道,所以新的标签可以保持选中状态。mqkwyuun2#
您可以尝试使用tab.focus()
我的应用程序中有选项卡,这是一种使所选选项卡可见的快速方法。
6ljaweal3#
您是否尝试过绑定到TabItem.IsSelected并在视图模型中更新它?
nxagd54h4#
在我拥有的一个较旧的C#应用程序中,使用页面控件,我能够通过告诉选项卡控件对象选择选项卡来强制页面处于活动状态。