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

时间:2011-10-28 13:03:05

标签: wpf tabcontrol tabitem

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

我试过这些但是没有用!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True

8 个答案:

答案 0 :(得分:36)

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

Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));

这就是Phyxx'计时器确实如此,但稍微不那么极端。

答案 1 :(得分:22)

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

有效

MyTabControl.SelectedIndex = x   
MyTabControl.SelectedItem = MyTabItem    
MyTabItem.IsSelected = True 

无效

MyTabControl.SelectedValue = MyTabItem 

答案 2 :(得分:14)

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

tabItem.IsSelected = true

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

答案 3 :(得分:12)

上面没有提到的一件事:

此类内容无法使用的主要原因是标签项没有设置“名称”属性。要以编程方式导航到选项卡控件的每个选项卡项必须为其中任何上述代码设置其name属性。

<tabItem Name="tab1"></tabItem>

答案 4 :(得分:5)

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

  1. 在视图模型中定义属性 - Selected int type

  2. 绑定视图中的属性

    <TabControl
        x:Name="TabsCandidate" 
        VerticalAlignment="Stretch" 
        TabStripPlacement="Top"
        SelectedIndex="{Binding Selected}"
    
  3. private int _selected;

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

    如果您想从父标签面板中的标签面板导航,此解决方案将完全正常工作,您需要做的就是访问控件的数据上下文并进行设置

    // 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;
    

答案 5 :(得分:1)

尝试在您的用户界面的MyTabControl.SelectedIndex = xDataContextChanged的事件处理程序中设置Loaded。希望这会奏效。

答案 6 :(得分:1)

我尝试了应该工作的所有方法,但是像你一样,实际上并没有改变所选的选项卡。最后,我通过将标签选择代码放在DispatcherTimer刻度线中来实现它。

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 

答案 7 :(得分:0)

如果您不知道标签的索引(不是 TabIndex的提示),请使用:

    private async Task ChangeTabTo(TabItem wantedTab) {
        int index = 0;
        for (var i = 0; i < TabControl.Items.Count; i++) {
            var tab = TabControl.Items[i];
            var t = tab as TabItem;
            if (t == null) continue;
            if (t == wantedTab) {
                index = i;
                break;
            }
        }

        await Dispatcher.BeginInvoke((Action)(() => TabControl.SelectedIndex = index));
    }

或如果您不想保留对该标签的引用,则将其修改为按名称搜索