如何以编程方式选择WPF TabControl中的TabItem

Pie*_*ant 35 wpf tabcontrol tabitem

我想知道如何在WPF TabControl中选择特定的TabItem.

我尝试过这些但是没有用!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
Run Code Online (Sandbox Code Playgroud)

Adr*_*ala 43

正如@Chris所说,前三件事中的任何一件都应该有效,正如@Phyxx所说,它并不总是真的有效.问题是关于财产变化顺序的一些微妙之处.要解决它,您需要让WPF在其自己的时间内调用您的选项卡选择代码:

Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));
Run Code Online (Sandbox Code Playgroud)

这就是Phyxx'计时器的作用,但是稍微不那么极端.

  • 我的猜测:MS级别错误,但不是"公然".WPF是一个复杂而模糊的API,似乎没有"一种正确的方法"来使用它.因此,您肯定会创建一个MS没有测试预期或防范的情况.在这种情况下,我们以某种方式设置字段要么太晚(因此被忽略)或太早(因此它被覆盖).没有人,甚至微软都不知道什么是合适的时间. (3认同)
  • 如果它能让您平静下来 - 为某些 WPF UI 操作调用调度程序是完全正常的,这实际上是确保它在正确的时间、正确的环境中发生的最佳方法。对于多线程应用程序或使用任务时尤其如此。阿德里安的答案应该标记为“答案”——它是最正确的答案。 (2认同)
  • @Digifaktur,这也几乎让我平静下来。我对微软太苛刻了;GUI 框架很难,因为一切都可能以谁知道的顺序得到关于其他一切的通知。我对`Dispatcher.*Invoke` 在线程之间分流代码感到满意,但是当我不得不在单个线程中盲目使用它时我会感到紧张,因为我不明白发生了什么。 (2认同)

HCL*_*HCL 22

您的所有示例除了第三个示例都是正确的并且将起作用.问题必须在另一个地方.也许您在设置后重置项目或从未调用您的代码?

有效

MyTabControl.SelectedIndex = x   
MyTabControl.SelectedItem = MyTabItem    
MyTabItem.IsSelected = True 
Run Code Online (Sandbox Code Playgroud)

无效

MyTabControl.SelectedValue = MyTabItem 
Run Code Online (Sandbox Code Playgroud)


小智 14

循环通过TabItems并选择要设置的选项卡

tabItem.IsSelected = true
Run Code Online (Sandbox Code Playgroud)

如果由于绑定更改而有任何其他地方,您将看到问题.否则,上面的代码应该工作.


小智 12

上面没有提到的一件事:

这样的事情不起作用的主要原因是标签项没有设置"名称"属性.要以编程方式导航到选项卡控件的每个选项卡项必须为其中任何上述代码设置其name属性.

<tabItem Name="tab1"></tabItem>
Run Code Online (Sandbox Code Playgroud)


小智 5

我已经实现了一个基于MVVM绑定的小解决方案,用于实用地选择选项卡面板.

  1. 在视图模型中定义属性 - 选择int类型

  2. 绑定视图中的属性

    <TabControl
        x:Name="TabsCandidate" 
        VerticalAlignment="Stretch" 
        TabStripPlacement="Top"
        SelectedIndex="{Binding Selected}"
    
    Run Code Online (Sandbox Code Playgroud)
  3. private int _selected;

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 将值设置为Select属性,只需绑定即可激活选项卡面板.

    如果你想从父选项卡面板中的选项卡面板导航,这个解决方案将只是工作,你需要做的就是,访问你的控件的数据上下文并设置它

    // set the property value of the view model which points the index of the tab controller.
    ((CandidateViewModel)((System.Windows.FrameworkElement)candidateTab.Content).DataContext).Selected = CandidateLogTabIndex;
    
    Run Code Online (Sandbox Code Playgroud)