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

этот образец показывает пару Tabs. Вкладка выбирается при щелчке фона заголовка, однако при нажатии кнопки вкладка не выбирается. Я хочу, чтобы кнопка приняла щелчок, но я также хочу, чтобы вкладка, соответствующая кнопке, была выбрана. Может кто-нибудь помочь?

спасибо, Hitesh

2 ответов


мы можем сделать это с помощью Маршрутизация Событие. 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;
}

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

в событии selectionchanged listbox я только что изменил selecteditem элемента управления tab на тот, который я хочу, т. е.

            Tbctrl.SelectedItem = (TabItem)Tbctrl.FindName("item2");

здесь Tbctrl-это имя tabcontrol, а item2-имя tabitem в tabcontrol, который содержит упомянутые текстовые поля выше.

С уважением,

Даваль