Поменять тригер в шаблоне XAML ("наследование шаблонов")
Я создал стиль для кнопок DefaultButton, в котором сделал сеттер для шаблона, и внутри шаблона сделал несколько тригеров, чтобы кнопка меняла фон:
<Style TargetType="Button" x:Key="DefaultButton">
<Setter Property="Background" Value="#FFE5E5E5" />
<Setter Property="BorderThickness" Value="0" />
<Setter Property="Margin" Value="1" />
<Setter Property="FontSize" Value="22" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button" >
<Border Background="{TemplateBinding Background}">
<ContentPresenter
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefault" Value="True">
<Setter Property="Background" Value="#FFE5E5E5"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFD6D6D6"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#FFA5A5A5"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#FFBABABA"/>
<Setter Property="Foreground" Value="#FF9A9A9A"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
После этого я захотел точно такой же стиль, но только что бы поменять два тригера, так, чтобы фон при наведении был другим. Я могу с лёгкостью унаследовать стиль с помощью BaseOn="StaticResource DefaultButton" и изменить сеттер для шаблона.
Получился вот такой 2й стиль:
<Style TargetType="Button" x:Key="OperationButton" BasedOn="{StaticResource DefaultButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button" >
<Border Background="{TemplateBinding Background}">
<ContentPresenter
Margin="5"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefault" Value="True">
<Setter Property="Background" Value="#FFE5E5E5"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF89E8E6"/> <!-- первое отличие --!>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#FF94F3F2"/> <!-- второе отличие --!>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" Value="#FFBABABA"/>
<Setter Property="Foreground" Value="#FF9A9A9A"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Получилось 90% повторяющегося кода из-за отсутсвия наследования для шаблонов. Можно ли как-то этого избежать и писать 2 строчке вместо копирования 20ти?
Ответы (1 шт):
Подмена данных в стилях легко достигается при помощи следующего трюка. В триггере данные не хардкодируем, а берём из ресурсов стиля, а в новом стиле переопределяем их. Получается вот что:
<Style TargetType="Button" x:Key="DefaultButton">
<Style.Resources>
<SolidColorBrush x:Key="MouseOverBrush">#FFD6D6D6</SolidColorBrush>
</Style.Resources>
<Setter Property="Background" Value="#FFE5E5E5" />
...
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button" >
...
<ControlTemplate.Triggers>
...
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background"
Value="{DynamicResource MouseOverBrush}"/>
</Trigger>
...
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="Button" x:Key="OperationButton" BasedOn="{StaticResource DefaultButton}">
<Style.Resources>
<!-- тут переопределяем цвета -->
<SolidColorBrush x:Key="MouseOverBrush">#FF89E8E6</SolidColorBrush>
</Style.Resources>
</Style>