Как заставить Style.Triggers запускать другой именованный стиль для применения
Скажем, у меня есть следующее:
<Style TargetType="{x:Type TextBox}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="Gray" />
<Style.Triggers>
<Trigger Property="IsFocused" Value="true">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
</Style.Triggers>
</Style>
Это прекрасно работает, и здесь нет ничего плохого, но это довольно простой случай. Что произойдет, если я хочу, чтобы состояние стиля IsFocused отображалось как exsplicit style, как ссылаться на этот стиль как стиль IsFocused, т.е.
<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="Gray" />
<Style.Triggers>
<Trigger Property="IsFocused" Value="true">
-- Here I want to reference ActiveStyle and not copy the copy the setters
</Trigger>
</Style.Triggers>
</Style>
Ответы
Ответ 1
Я не думаю, что вы, однако, можете использовать стиль таким образом:
<Style x:Key="ActiveStyle" TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="IsFocused" Value="true">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ActiveStyle}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="Gray" />
</Style>
Я не вижу другого решения: (
Ответ 2
WPF предоставляет специальное свойство для этого элемента FrameworkElement.FocusVisualStyle. Итак, продолжайте и назначьте следующее:)
<TextBox FocusVisualStyle="{StaticResource ActiveStyle}" .....
Или другим способом с помощью seters
<Style TargetType="{x:Type TextBox}">
<Setter Property="BorderThickness" Value="1" />
<Setter Property="BorderBrush" Value="Gray" />
<Setter Property="FocusVisualStyle" >
<Setter.Value>
<Style x:key="ActiveStyle" TargetType="{x:Type TextBox}">
<Setter Property="BorderBrush" Value="Green" />
<Setter Property="BorderThickness" Value="2" />
</Style>
</Setter.Value>
</Setter>
</Style>
Ответ 3
Есть еще третий способ сделать это.
Создайте два управляемых шаблона для вашего управления:
<ControlTemplate x:Key="NotFocused" TargetType="{x:Type TextBox}">
. . .
</ControlTemplate>
<ControlTemplate x:Key="Focused" TargetType="{x:Type TextBox}">
. . .
</ControlTemplate>
Затем вы создаете стиль по умолчанию для TextBox с триггерами в нем:
<Style TargetType="{x:Type TextBox}">
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="Template" Value="{StaticResource Focused}" />
</Trigger>
<Trigger Property="IsFocused" Value="False">
<Setter Property="Template" Value="{StaticResource NotFocused}" />
</Trigger>
</Style.Triggers>
</Style>
Тони