WPF 从样式触发器重写样式



我有一个单选按钮,它设置了样式以使其显示为切换按钮,我想将其默认背景颜色设置为绿色,但是当它处于活动状态/选中时,我希望它改变颜色。 在下面的例子中,我希望它是蓝色的。 无论我尝试什么,绿色都不会被覆盖。 我错过了什么?

按钮:

<RadioButton GroupName="Rating" Background="Green" Style="{StaticResource RatingToggleButtons}" x:Name="Normal" Content="Normal" Grid.Row="0" />

风格:

<Style x:Key="RatingToggleButtons" TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource MahApps.Metro.Styles.MetroToggleButton}">
<Setter Property="Margin" Value="5 5 5 5" />
<Setter Property="MinWidth" Value="100"/>
<Setter Property="MinHeight" Value="50"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>            
</Style>

简而言之,与通过样式设置的背景相比,通过控件模板应用的背景占上风(您的情况(。因此,您需要编辑控件模板。

<RadioButton.Template>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" TValue="#FF838383"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</RadioButton.Template>

注意:代码未测试

请参阅:http://www.diranieh.com/NET_WPF/Properties.htm

我错过了什么?

本地值优先于样式设置的值的事实:https://learn.microsoft.com/en-us/dotnet/framework/wpf/advanced/dependency-property-value-precedence

因此,不要像这样设置本地值:

<RadioButton ... Background="Green" ... />

。您应该在Style中定义默认值:

<Style TargetType="{x:Type ToggleButton}">
<Setter Property="Background" Value="Green"/>
<Setter Property="Margin" Value="5 5 5 5" />
<Setter Property="MinWidth" Value="100"/>
<Setter Property="MinHeight" Value="50"/>
<Style.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter Property="Background" Value="Blue"/>
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>

。并再次避免设置RadioButton元素的Background属性:

<RadioButton GroupName="Rating" Style="{StaticResource RatingToggleButtons}" x:Name="Normal" Content="Normal" Grid.Row="0" />

最新更新