特别感谢@BionicCode 让我开始使用我的用户控件样式: 自定义控件的样式
我创建了一个带有按钮和文本块的简单演示自定义控件。现在我正在为按钮添加样式。
首先,我在代码文件中添加了一个ComponentResourceKey:
public static ComponentResourceKey ButtonStyleKey = new ComponentResourceKey(typeof(MyCustomControl), "ButtonStyle");
接下来,我将按钮样式添加到我的 Generic.xaml 文件中
<Style x:Key="{x:Static local:MyCustomControl.ButtonStyleKey}"
TargetType="{x:Type Button}">
<Setter Property="Background" Value="#EEEEEEEE"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="10 5"/>
<Setter Property="FontSize" Value="14" />
<Setter Property="BorderThickness" Value="2" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Border x:Name="Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"/>
<ContentPresenter x:Name="content"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Margin" Value="2 1" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="Orange"/>
<Setter Property="Foreground" Value="Blue"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground" Value="Gray"/>
<Setter Property="Foreground" Value="DarkGray"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
这是控件模板中的按钮
<Button Grid.Row="0"
x:Name="button"
Height="65"
Width="150"
Content="A Button"
Style="{DynamicResource {x:Static local:MyCustomControl.ButtonStyleKey}}"/>
问题出在 IsPressed 触发器上。背景颜色不会变成红色。
MouseOver 触发器工作正常,并将按钮的背景设置为橙色,IsEnabled 触发器也将颜色设置为禁用,所以我知道样式在其他情况下工作正常。
我认为 IsMouseOver 将战胜 IsPressed,因为 IsMouseOver 是在 IsPressed 之后定义的
尝试切换它们
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Background" Value="Orange"/>
<Setter Property="Foreground" Value="Blue"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Red"/>
<Setter Property="Margin" Value="2 1" />
</Trigger>
如果您想在 IsMouseOver 和 IsPressed 同时为 true 时有不同的行为,您应该查看 MultiTrigger