我为按钮创建了一个样式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"
并更改模板的设置器。
结果是第二种风格:
<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 行?
使用以下技巧可以轻松实现替换样式中的数据。在触发器中,我们不对数据进行硬编码,而是从样式资源中获取数据,并在新样式中重新定义它们。事实证明: