WPF, явно использующий стили для всех TabItems в моей панели

#wpf #xaml

#wpf #xaml

Вопрос:

У меня есть окно с TabControl, все TabItems в этом TabControl должны иметь одинаковый стиль:

 <TabControl Name="TabControl1">
    <TabControl.Resources>
         <Style TargetType="TabItem">...</Style>
    </TabControl.Resources>

    <TabItem Header="Tab Item 1"/>
    <TabItem Header="Tab Item 2"/>
    <TabItem Header="Tab Item 3"/>
</TabControl>
  

Конечно, это работает так, как ожидалось.

Я хочу, чтобы несколько TabItems в моем приложении имели этот стиль. Некоторые другие TabItems в других TabControls должны иметь другой стиль. Итак, я создал несколько стилей в App.XAML:

 <Style x:Key="TabItemStyle1" TargetType="TabItem">...</Style>
<Style x:Key="TabItemStyle2" TargetType="TabItem">...</Style>
  

Теперь я должен указать, что все TabItems в моем TabControl1 должны использовать TabItemStyle1.

 <TabControl Name="Example2">
    <TabItem Header="Tab Item 1" Style="{StaticResource TabItemStyle1}" />
    <TabItem Header="Tab Item 2" Style="{StaticResource TabItemStyle1}"/>
    <TabItem Header="Tab Item 3" Style="{StaticResource TabItemStyle1}"/>
</TabControl>
  

Это работает, но я бы предпочел определить, что все TabItems в TabControl1 должны использовать TabItemStyle1 .

 <TabControl Name="Example3">
    <TabControl.Resources>
         <Style TargetType="TabItem"        ???
    </TabControl.Resources>

    <TabItem Header="Tab Item 1"/>
    <TabItem Header="Tab Item 2"/>
    <TabItem Header="Tab Item 3"/>
</TabControl>
  

Как это сделать?

Ответ №1:

Вы можете создать новый неявный стиль, ограниченный tabcontrol и наследующий TabItemStyle1.

 <TabControl Name="Example3">
    <TabControl.Resources>
         <Style TargetType="TabItem" BasedOn="{StaticResource TabItemStyle1}"/>
    </TabControl.Resources>
  

(Выше приведен воздушный код, я не проверял точный синтаксис в приложении).

Комментарии:

1. Это работает, но на самом деле я создаю новый стиль, не так ли?

2. Это так. Но вы не можете установить стиль для чего-то из его собственного стиля.

Ответ №2:

Установите ItemContainerStyle of TabControl , который будет применять стиль ко всем TabItem элементам.

 <TabControl>
   <TabControl.ItemContainerStyle>
      <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
         <!-- ...your setters. -->
      </Style>
   </TabControl.ItemContainerStyle>
   <TabItem Header="Tab Item 1"/>
   <TabItem Header="Tab Item 2"/>
   <TabItem Header="Tab Item 3"/>
</TabControl>
  

Вы, конечно, также можете ссылаться на них, если они определены в другом месте, например в App.xaml :

 <TabControl ItemContainerStyle="{StaticResource TabItemStyle1}">
  

Оба примера применяют стиль только к TabItems внутри связанного TabControl . Если вы хотите, чтобы эти стили применялись ко всем TabItem элементам внутри других вложенных TabControl элементов, тогда вам нужно создать неявный стиль с областью TabControl , как предложил @Andy.

 <TabControl>
   <TabControl.Resources>
      <Style TargetType="{x:Type TabItem}" BasedOn="{StaticResource {x:Type TabItem}}">
         <!-- ...your setters. -->
      </Style>
   </TabControl.Resources>
   <TabItem Header="Tab Item 1">
      <TabControl>
         <TabItem Header="Nested tab Item 1"/>
         <TabItem Header="Nested tab Item 2"/>
         <TabItem Header="Nested tab Item 3"/>
      </TabControl>
   </TabItem>
   <TabItem Header="Tab Item 2"/>
   <TabItem Header="Tab Item 3"/>
</TabControl>