#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>