繁体   English   中英

WPF TabControl - 无法以编程方式 select 选项卡

[英]WPF TabControl - Cannot programmatically select tabs

我有一个带有 TabControl 的用户界面,它最初显示一个起始页。 其他项目可以通过双击内容添加到其中,例如,DataGrid。 创建新选项卡时应选择它们。 如果与网格中的项目对应的文档已经打开,则应该打开该文档的现有选项卡,而不是创建一个新选项卡。

我知道我应该能够通过设置 TabControl 的 SelectedItem 或 SelectedIndex 属性以编程方式 select 选项卡。 但是,所需的选项卡从未真正激活。 如果我设置一个然后在调试器中检查 TabControl 的 state,那么这两个字段似乎都能正确更新。 但是,在我继续执行之后,我看到选定的选项卡在 UI 中保持不变,如果我暂停并再次检查 TabControl 的 state,我会看到 SelectedItem 和 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;
}

原来这与我在原始问题描述中方便地省略的内容有关:

有问题的 DataGrid 在 StartPageTab 的内容中。 我通过捕获其 MouseDoubleClick 事件来处理对该 DataGrid 的双击,搜索可视化树以查找双击了 DataGridRow 的内容(如果有的话),然后引发最终将由主 window 捕获的事件,该事件将响应通过调用 _SelectTab 或 _AddTab,具体取决于相关文档是否已打开。

此时,调用堆栈将展开并返回到该 MouseDoubleClick 事件处理程序。 在那个处理程序中,我忘记将 MouseButtonEventArgs 的 Handled 属性设置为 true。 因此 WPF 一直在寻找其他人来处理该点击事件 - 它最终找到的元素会通过请求焦点来响应,这反过来意味着原始选项卡需要重新获得焦点。

添加e.Handled = true; 停止了整个混乱,因此新标签可以保持选中状态。

您可以尝试使用 tab.focus()

我的应用程序中有标签,这是使您选择的标签可见的快速方法。

您是否尝试过绑定到TabItem.IsSelected并在您查看 model 时对其进行更新?

在我拥有的较旧的 C# 应用程序中,使用页面控件,我能够通过将选项卡控件 object 告诉 select 选项卡来强制页面处于活动状态...

MyTabControlWithMultiplePages.SelectTab(PageIWantShown);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM