Как программно выбрать TabItem в WPF TabControl - PullRequest
34 голосов
/ 28 октября 2011

Я хотел бы знать, как выбрать определенный TabItem в WPF TabControl.

Я пробовал это ниже, но ничего не работает!

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True

Ответы [ 8 ]

40 голосов
/ 21 сентября 2014

Как говорит @Chris, любая из первых трех вещей должна работать, и, как говорит @Phyxx, она не всегда действительно работает.Проблема заключается в некоторой тонкой вещи в порядке изменения свойств.Чтобы обойти это, вам нужно позволить WPF вызывать ваш код выбора вкладок в свое время:

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

Это делает то же, что и таймер Phyxx, но немного менее экстремально.

22 голосов
/ 28 октября 2011

Все ваши примеры, кроме третьего, верны и будут работать.Проблема должна быть в другом месте.Может быть, вы сбрасываете пункт после установки или ваш код никогда не вызывается?

Действительный

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

Недействительный

MyTabControl.SelectedValue = MyTabItem 
14 голосов
/ 03 июня 2012

Циклически перебирая TabItems и для выбранной вкладки установите

tabItem.IsSelected = true

Если есть какие-либо другие места из-за изменения привязки, вы увидите проблему. В противном случае приведенный выше код должен работать.

12 голосов
/ 10 ноября 2013

Одна вещь, которая не была упомянута выше:

Основная причина, по которой что-то подобное не сработает, заключается в том, что для элементов вкладок не установлено свойство «Имя».Каждый элемент вкладки элемента управления вкладки, к которому вы хотите перейти программно, должен иметь свое свойство name, установленное для работы любого из приведенного выше кода.

<tabItem Name="tab1"></tabItem>
5 голосов
/ 13 июля 2017

Я реализовал небольшое решение на основе привязок MVVM для прагматичного выбора панелей вкладок.

  1. определить свойство в вашей модели представления - Выбранный тип int

  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;
    
1 голос
/ 26 декабря 2013

Я перепробовал все методы, которые должны сработали, но, как и вы, на самом деле ничего не изменило выбранную вкладку.В конце концов я заставил его работать, поместив код выбора вкладки в DispatcherTimer галочку.

       DispatcherTimer switchTabTimer = new DispatcherTimer();
       switchTabTimer.Interval = new TimeSpan(0);
       switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
       {
           myTabControl.SelectedIndex = 0;
           switchTabTimer.Stop();
       };
       switchTabTimer.Start(); 
1 голос
/ 28 октября 2011

Попробуйте установить MyTabControl.SelectedIndex = x в обработчике событий DataContextChanged или Loaded вашего интерфейса. Надеюсь, это сработает.

0 голосов
/ 09 января 2019

, если вы не знаете индекс вкладки (намекните, что не 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));
    }

или измените его для поиска по имени, если вы не хотите сохранять ссылку на вкладку

...