簡體   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