Как изменить выбранную вкладку при нажатии кнопки в 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