Как изменить выбранную вкладку при нажатии кнопки в WPF TabControl с кнопками в заголовке
У меня есть WPF TabControl
, в котором есть несколько кнопок в заголовке TabItem
.
Я хочу, чтобы выбранная вкладка изменилась при нажатии кнопки с заголовком. Вот
это фрагмент кода:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<TabControl>
<TabItem Content="Item 1 Content">
<TabItem.Header>
<StackPanel Orientation="Vertical">
<TextBlock FontSize="14" FontWeight="Bold" Text="Item1"/>
<StackPanel Orientation="Horizontal">
<Button Content="Action 1"/>
<Button Content="Action 2"/>
</StackPanel>
</StackPanel>
</TabItem.Header>
</TabItem>
<TabItem Content="Item 2 Content">
<TabItem.Header>
<StackPanel Orientation="Vertical">
<TextBlock FontSize="14" FontWeight="Bold" Text="Item2"/>
<StackPanel Orientation="Horizontal">
<Button Content="Action 1"/>
<Button Content="Action 2"/>
</StackPanel>
</StackPanel>
</TabItem.Header>
</TabItem>
</TabControl>
</Grid>
</Page>
Этот пример показывает пару Tab
s. Если выбрана кнопка заголовка, выбирается вкладка, если нажата кнопка, вкладка не выбрана. Я хочу, чтобы кнопка приняла клик, но я также хочу, чтобы вкладка, соответствующая кнопке, была выбрана. Может ли кто-нибудь помочь?
Спасибо,
Hitesh
Ответы
Ответ 1
Мы можем сделать это, используя Маршрутизация событий. RoutedEvents, например Click, пузырьки дерева элементов, пока что-то не обработает событие. Из-за этого вы на самом деле уже получаете событие Click на вкладках, мы пока ничего не делаем с ним.
Мы могли бы создать событие для обработки кнопки. Нажмите на элементы табуляции, как это:
<TabItem Content="Item 1 Content" ButtonBase.Click="TabItem_Click">
Однако нам нужно было бы установить это на каждой вкладке, поэтому вместо этого мы можем создать стиль для TabItems в TabControl следующим образом:
<TabControl>
<TabControl.ItemContainerStyle>
<Style TargetType="{x:Type TabItem}">
<EventSetter Event="ButtonBase.Click"
Handler="TabItem_Click" />
</Style>
</TabControl.ItemContainerStyle>
....
</TabControl>
Теперь, в нашем обработчике событий мы можем выбрать вкладку, которая была нажата:
private void TabItem_Click(object sender, RoutedEventArgs e)
{
Trace.WriteLine("TabItemClicked");
((TabItem)sender).IsSelected = true;
e.Handled = true;
}
Ответ 2
Я делал немного RnD по вышеуказанной проблеме прямо сейчас и смог достичь вышеизложенного по-другому, но все равно было бы здорово, если бы я мог помочь мне в том, как вы выполнили работу.
В событии selectionchanged из списка я просто изменил выбранный элемент элемента управления табуляции на тот, который я хочу i.e.
Tbctrl.SelectedItem = (TabItem)Tbctrl.FindName("item2");
Здесь Tbctrl - это имя tabcontrol, а item2 - имя tabitem в tabcontrol, которое содержит текстовые поля, упомянутые выше.
Привет,
Dhaval