我有一个使用自定义样式的 WPF 应用程序。其中我有一组按钮,每个按钮都有一个自定义背景图像。对于每个按钮,我提供了一个正常的和鼠标按下的图像。有没有一种简单的方法可以使用单一样式(并根据具体情况自定义每个按钮)?
目前我正在为每个按钮创建一种新样式,这肯定不是最好的方法吗?
对于仅 XAML 的解决方案,您可以考虑:-
我假设您正在使用控件模板作为您的样式的一部分,如下所示:-
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Image x:Name="img" Style="{DynamicResource NormalImage}"/>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Source" TargetName="img" Value="Images\DisabledImage.png"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我已经在这里删除了控制模板,你的可能更复杂
现在,如果您在与上述样式相同的区域中添加以下样式,那么这将指定用于默认情况的图像
<Style x:Key="NormalImage" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Images/DeafultImage.png"/>
</Style>
当您需要使用按钮时,您可以在 XAML 中进一步执行以下操作:-
<Button Style="{DynamicResource MyButtonStyle}" >
<Button.Resources>
<Style x:Key="NormalImage" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Images/OverrideImage.png"/>
</Style>
</Button.Resources>
</Button>
它并不漂亮,但仍然允许主样式,并且比使用多种样式更短且重复更少。
它的工作方式是首先在按钮的资源(通常为空)中搜索资源名称“NormalImage”,然后是父容器,一直到页面/窗口资源,再到应用程序资源。第一场比赛获胜,因此在这种情况下,引用 OverrideImage.png 的名为“NormalImage”的本地定义样式将在与引用 DefaultImage.png 的名称相同的窗口/页面/容器级别资源之前选择
如果所有按钮或大多数按钮都将使用此样式,则从样式定义中删除 x:Key="MyButtonStyle"。这样,WPF 将在范围内的所有按钮上使用样式,而无需显式指定样式。然后,您可以使用 style="{x:null}" 明确地不使用默认样式。因此:-
<Window.Resources>
<Style x:Key="NormalImage" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Images/DeafultImage.png"/>
</Style>
<Style TargetType="{x:Type Button}">
<Setter Property="Template">
...
</Setter>
</Style>
</Window.Resources>
<Button >
<Button.Resources>
<Style x:Key="NormalImage" TargetType="{x:Type Image}">
<Setter Property="Source" Value="Images/OverrideImage.png"/>
</Style>
</Button.Resources>
</Button>
<Button Style="{x:null}>Normal Button</Button>
您可以在 ResourceDictionary 中创建样式,然后将该字典合并到您的控件资源中。如果您给样式一个键,那么您可以将任何按钮绑定到该样式。
例如:
<Style x:Key="imageButton" ControlType="{x:Type Button}">
...
</Style>
<Button Style="{DynamicResource imageButton}" />