WPF使用静态属性制作按钮样式

<Window.Resources>
<Style x:Key="CustomButtonStyle" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}">
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Border>
<ControlTemplate.Triggers>
<!-- 正常状态 -->
<Trigger Property="IsPressed" Value="False">
<Setter TargetName="border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).NormalColor}"/>
<Setter TargetName="border" Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).NormalColor}"/>
</Trigger>

<!-- 按下状态 -->
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).PressedColor}"/>
<Setter TargetName="border" Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).PressedColor}"/>
</Trigger>
<!-- 鼠标悬停状态 -->
<Trigger Property="IsMouseOver" Value="True">
<!--<Setter TargetName="border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).MouseOverColor}"/>-->
</Trigger>
<!-- 禁用状态 -->
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).DisabledColor}"/>
<Setter TargetName="border" Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(local:ColorSetHelper.ColorSet).DisabledColor}"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<StackPanel Background="#fff">
<Button Content="Button 1" Width="100" Height="30" Style="{StaticResource CustomButtonStyle}"/>
<Button Content="Button 2" Width="100" Height="30" Style="{StaticResource CustomButtonStyle}"
local:ColorSetHelper.ColorSet="{x:Static local:ButtonColorSets.Button2Colors}"/>
<Button IsEnabled="True" Content="Button 3" Width="100" Height="30" Style="{StaticResource CustomButtonStyle}"
local:ColorSetHelper.ColorSet="{x:Static local:ButtonColorSets.Button3Colors}"/>
</StackPanel>

public class ColorSetHelper
{
public static readonly DependencyProperty ColorSetProperty =
DependencyProperty.RegisterAttached("ColorSet", typeof(ButtonColors), typeof(ColorSetHelper), new PropertyMetadata(new ButtonColors
{
NormalColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#111")),
PressedColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#222")),
MouseOverColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#333")),
DisabledColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#444"))
}));

public static void SetColorSet(DependencyObject obj, ButtonColors value)
{
obj.SetValue(ColorSetProperty, value);
}

public static ButtonColors GetColorSet(DependencyObject obj)
{
return (ButtonColors)obj.GetValue(ColorSetProperty);
}
}


public class ButtonColors
{
public Brush NormalColor { get; set; }
public Brush PressedColor { get; set; }
public Brush MouseOverColor { get; set; }
public Brush DisabledColor { get; set; }
}

public static class ButtonColorSets
{
public static ButtonColors Button2Colors { get; } = new ButtonColors
{
NormalColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#555")),
PressedColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#666")),
MouseOverColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#777")),
DisabledColor = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#888"))
};
public static ButtonColors Button3Colors { get; } = new ButtonColors
{
NormalColor = Brushes.Red,
PressedColor = Brushes.Pink,
MouseOverColor = Brushes.SkyBlue,
DisabledColor = Brushes.Green
};
}

posted @ 2024-05-21 11:08  奇迹之耀  阅读(14)  评论(0编辑  收藏  举报