Я хотел бы знать, как выбрать конкретный TabItem в WPF TabControl.
Я пробовал это, но ничего не работает!
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabControl.SelectedValue = MyTabItem
MyTabItem.IsSelected = True
Я хотел бы знать, как выбрать конкретный TabItem в WPF TabControl.
Я пробовал это, но ничего не работает!
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabControl.SelectedValue = MyTabItem
MyTabItem.IsSelected = True
Как говорит @Chris, любая из первых трех вещей должна работать, и, как говорит @Phyxx, это не всегда действительно работает. Проблема заключается в некоторой тонкости в отношении порядка изменений свойств. Чтобы обойти это, вы должны позволить WPF вызывать ваш код выбора вкладок в свое время:
Dispatcher.BeginInvoke((Action)(() => MyTabControl.SelectedIndex = x));
Это делает то, что делает таймер Phyxx, но немного менее экстремальным образом.
Все ваши примеры, кроме третьего, являются правильными и будут работать. Проблема должна быть в другом месте. Возможно, вы reset элемент после настройки или ваш код никогда не вызывается?
Действительный
MyTabControl.SelectedIndex = x
MyTabControl.SelectedItem = MyTabItem
MyTabItem.IsSelected = True
Неверный
MyTabControl.SelectedValue = MyTabItem
Прокрутите вкладку TabItems и для выбранной вкладки установите
tabItem.IsSelected = true
Если в результате изменения привязки есть другое место, вы увидите проблему. В противном случае вышеуказанный код должен работать.
Одна вещь, о которой не упоминалось выше:
Основная причина, по которой это не работает, не будет заключаться в том, что элементы табуляции не имеют установленного свойства "Имя". Каждый элемент табуляции элемента управления вкладки, для которого вы хотите перейти программно, должен иметь свойство имени, установленное для работы любого из вышеуказанных кодов.
<tabItem Name="tab1"></tabItem>
Я применил небольшое решение для привязки 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;
Попробуйте установить MyTabControl.SelectedIndex = x
в обработчике событий DataContextChanged
или Loaded
вашего пользовательского интерфейса. Надеюсь, что это сработает.
Я пробовал все методы, которые должны были работать, но, как и вы, ничто не изменило выбранную вкладку. В конце концов, я получил его для работы, поставив код выбора вкладок в тике DispatcherTimer
.
DispatcherTimer switchTabTimer = new DispatcherTimer();
switchTabTimer.Interval = new TimeSpan(0);
switchTabTimer.Tick += (object timerSender, EventArgs timerE) =>
{
myTabControl.SelectedIndex = 0;
switchTabTimer.Stop();
};
switchTabTimer.Start();
если вы не знаете индекс вкладки (подсказка, это не 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));
}
или измените его для поиска по имени, если вы не хотите сохранять ссылку на вкладку