Подтвердить что ты не робот

Как программно выбрать TabItem в WPF TabControl

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

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

MyTabControl.SelectedIndex = x

MyTabControl.SelectedItem = MyTabItem

MyTabControl.SelectedValue = MyTabItem

MyTabItem.IsSelected = True
4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Неверный

MyTabControl.SelectedValue = MyTabItem 

Ответ 3

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

tabItem.IsSelected = true

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

Ответ 4

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

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

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

Ответ 5

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

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

  • привязать свойство в вашем представлении

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

    public int Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            OnPropertyChanged("Selected");
        }
    }
    
  • Задайте значение Выбрать, просто привязка активирует панель вкладок.

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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