创建一个新的资源字典Project > Add new item... > Resource Dictionary (WPF)并将其命名为SaveButton.xaml
。将资源复制到这个新的资源字典中。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<SolidColorBrush x:Key="Button.Static.Background" Color="#ff609d9f"/>
<!-- ...other resources. -->
</ResourceDictionary>
为其他按钮样式创建一个字典并将它们添加到应用程序资源中。
<Application x:Class="Thermologger.Start.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Thermologger.Start"
Startup="Application_Startup">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="SaveButton.xaml"/>
<!-- ...other resource dictionaries. -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
如果您只想更改颜色,则不需要复制按钮样式和模板。一种方法可能是为您的不同样式分离画笔,如下所示:
- 创建资源字典,例如
ButtonStyles.xaml
.
- 在那里提取默认的按钮样式和模板。
- 将按钮样式重命名
x:Key
为BaseButtonStyle
.
- 用标记扩展替换所有以画笔为目标
StaticResource
的x:Static
引用DynamicResource
(在运行时解析资源 - 这里是画笔)
- 为您的一个按钮创建一个基于您的中性基本样式的样式
BaseButtonStyle
,并将所有画笔从基本样式移动到Resources
新样式的。
- 自定义画笔以获得您的自定义样式。
- 使用每个新按钮的画笔复制此样式,替换它
x:Key
并调整画笔。
像上面一样将资源字典添加到应用程序资源中。现在,您可以在代码中使用其x:Key
.
<StackPanel>
<Button Style="{DynamicResource SaveButtonStyle}" Content="Test"/>
<Button Style="{DynamicResource CancelButtonStyle}" Content="Test"/>
</StackPanel>
在运行时,画笔将在逻辑树上进行解析。由于画笔在基本样式中不可用,因此在查找过程中可以在派生样式中找到它们。有关资源查找的详细信息,请参阅XAML 资源概述 (WPF .NET)。
查找在由设置属性的元素定义的资源字典中检查请求的键 [...] 查找向上遍历逻辑树到父元素及其资源字典。这个过程一直持续到到达根元素。[...]
这是一个用于保存和取消按钮的资源字典示例,带有惰性着色。
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="FocusVisual">
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate>
<Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="BaseButtonStyle" TargetType="{x:Type Button}">
<Setter Property="FocusVisualStyle" Value="{DynamicResource FocusVisual}"/>
<Setter Property="Background" Value="{DynamicResource Button.Static.Background}"/>
<Setter Property="BorderBrush" Value="{DynamicResource Button.Static.Border}"/>
<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="1"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsDefaulted" Value="true">
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="border" Value="{DynamicResource Button.MouseOver.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.MouseOver.Border}"/>
</Trigger>
<Trigger Property="IsPressed" Value="true">
<Setter Property="Background" TargetName="border" Value="{DynamicResource Button.Pressed.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.Pressed.Border}"/>
</Trigger>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Background" TargetName="border" Value="{DynamicResource Button.Disabled.Background}"/>
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource Button.Disabled.Border}"/>
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{DynamicResource Button.Disabled.Foreground}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Key="SaveButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
<Style.Resources>
<SolidColorBrush x:Key="Button.Static.Background" Color="Red"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="Blue"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="Yellow"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="Purple"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="Green"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="Orange"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="Brown"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="Aqua"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="AntiqueWhite"/>
</Style.Resources>
</Style>
<Style x:Key="CancelButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonStyle}">
<Style.Resources>
<SolidColorBrush x:Key="Button.Static.Background" Color="Black"/>
<SolidColorBrush x:Key="Button.Static.Border" Color="DarkSlateGray"/>
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="DimGray"/>
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="DarkGray"/>
<SolidColorBrush x:Key="Button.Pressed.Background" Color="LightGray"/>
<SolidColorBrush x:Key="Button.Pressed.Border" Color="Gray"/>
<SolidColorBrush x:Key="Button.Disabled.Background" Color="GhostWhite"/>
<SolidColorBrush x:Key="Button.Disabled.Border" Color="DimGray"/>
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="LightSlateGray"/>
</Style.Resources>
</Style>
</ResourceDictionary>
当然,如果需要,您也可以将它们拆分为几个不同的资源字典。