wpf 自定义Button按钮
Posted zisai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf 自定义Button按钮相关的知识,希望对你有一定的参考价值。
创建ButtonEx类
public class ButtonEx : Button
static ButtonEx()
DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonEx), new FrameworkPropertyMetadata(typeof(ButtonEx)));
/// <summary>
/// 按钮类型
/// </summary>
public ButtonType ButtonType
get return (ButtonType)GetValue(ButtonTypeProperty);
set SetValue(ButtonTypeProperty, value);
public static readonly DependencyProperty ButtonTypeProperty =
DependencyProperty.Register("ButtonType", typeof(ButtonType), typeof(ButtonEx), new PropertyMetadata(ButtonType.Normal));
/// <summary>
/// 图片
/// </summary>
public ImageSource Icon
get return (ImageSource)GetValue(IconProperty);
set SetValue(IconProperty, value);
public static readonly DependencyProperty IconProperty =
DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ButtonEx), new PropertyMetadata(null));
/// <summary>
/// 圆角
/// </summary>
public CornerRadius CornerRadius
get return (CornerRadius)GetValue(CornerRadiusProperty);
set SetValue(CornerRadiusProperty, value);
public static readonly DependencyProperty CornerRadiusProperty =
DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ButtonEx), new PropertyMetadata(new CornerRadius(0)));
/// <summary>
/// 鼠标悬停字体颜色
/// </summary>
public Brush MouseOverForeground
get return (Brush)GetValue(MouseOverForegroundProperty);
set SetValue(MouseOverForegroundProperty, value);
public static readonly DependencyProperty MouseOverForegroundProperty =
DependencyProperty.Register("MouseOverForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());
/// <summary>
/// 鼠标按下文字颜色
/// </summary>
public Brush MousePressedForeground
get return (Brush)GetValue(MousePressedForegroundProperty);
set SetValue(MousePressedForegroundProperty, value);
public static readonly DependencyProperty MousePressedForegroundProperty =
DependencyProperty.Register("MousePressedForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());
/// <summary>
/// 鼠标悬停边框颜色
/// </summary>
public Brush MouseOverBorderbrush
get return (Brush)GetValue(MouseOverBorderbrushProperty);
set SetValue(MouseOverBorderbrushProperty, value);
public static readonly DependencyProperty MouseOverBorderbrushProperty =
DependencyProperty.Register("MouseOverBorderbrush", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());
/// <summary>
/// 鼠标悬停背景颜色
/// </summary>
public Brush MouseOverBackground
get return (Brush)GetValue(MouseOverBackgroundProperty);
set SetValue(MouseOverBackgroundProperty, value);
public static readonly DependencyProperty MouseOverBackgroundProperty =
DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());
/// <summary>
/// 鼠标按下背景颜色
/// </summary>
public Brush MousePressedBackground
get return (Brush)GetValue(MousePressedBackgroundProperty);
set SetValue(MousePressedBackgroundProperty, value);
public static readonly DependencyProperty MousePressedBackgroundProperty =
DependencyProperty.Register("MousePressedBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());
/// <summary>
/// SVG
/// </summary>
public Geometry PathData
get
return (Geometry)GetValue(PathDataProperty);
set
SetValue(PathDataProperty, value);
// Using a DependencyProperty as the backing store for PathData. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PathDataProperty =
DependencyProperty.Register("PathData", typeof(Geometry), typeof(ButtonEx), new PropertyMetadata(new PathGeometry()));
public double PathWidth
get return (double)GetValue(PathWidthProperty);
set SetValue(PathWidthProperty, value);
// Using a DependencyProperty as the backing store for PathWidth. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PathWidthProperty =
DependencyProperty.Register("PathWidth", typeof(double), typeof(ButtonEx), new PropertyMetadata());
public double PathHeight
get return (double)GetValue(PathHeightProperty);
set SetValue(PathHeightProperty, value);
// Using a DependencyProperty as the backing store for PathHeight. This enables animation, styling, binding, etc...
public static readonly DependencyProperty PathHeightProperty =
DependencyProperty.Register("PathHeight", typeof(double), typeof(ButtonEx), new PropertyMetadata());
public enum ButtonType
Normal,
Icon,
Text,
IconText,
Path,
Content,
新增 ButtonEx.xaml
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:HL.SelfTicket.Controls">
<Style TargetType="x:Type local:ButtonEx">
<Setter Property="Focusable" Value="False"/>
<Setter Property="FocusVisualStyle" Value="x:Null" />
<Style.Triggers>
<Trigger Property="ButtonType" Value="Normal">
<Setter Property="Background" Value="#43a9c7"/>
<Setter Property="MouseOverBackground" Value="#2f96b4"/>
<Setter Property="MousePressedBackground" Value="#2a89a4"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="MouseOverForeground" Value="White"/>
<Setter Property="MousePressedForeground" Value="White"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Border x:Name="border" Background="TemplateBinding Background" CornerRadius="TemplateBinding CornerRadius" BorderBrush="TemplateBinding BorderBrush" BorderThickness="TemplateBinding BorderThickness" Width="TemplateBinding Width" Height="TemplateBinding Height" SnapsToDevicePixels="True">
<TextBlock x:Name="txt" Text="TemplateBinding Content" Foreground="TemplateBinding Foreground" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background" Value="Binding MousePressedBackground,RelativeSource=RelativeSource TemplatedParent"/>
<Setter TargetName="txt" Property="Foreground" Value="Binding MousePressedForeground,RelativeSource=RelativeSource TemplatedParent"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ButtonType" Value="Icon">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Border Width="TemplateBinding Width" Height="TemplateBinding Height">
<Image x:Name="Img" VerticalAlignment="Center" HorizontalAlignment="Center" Source="TemplateBinding Icon" Stretch="None"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.8"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value="0.9"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ButtonType" Value="Text">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Foreground" Value="#002c99"/>
<Setter Property="MouseOverForeground" Value="#FF2c99"/>
<Setter Property="MousePressedForeground" Value="#002c99"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<TextBlock x:Name="txt" Text="TemplateBinding Content" Foreground="TemplateBinding Foreground" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Binding MouseOverForeground,RelativeSource=RelativeSource TemplatedParent" TargetName="txt"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Binding MousePressedForeground,RelativeSource=RelativeSource TemplatedParent" TargetName="txt"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ButtonType" Value="IconText">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Foreground" Value="#555"/>
<Setter Property="MouseOverForeground" Value="#555"/>
<Setter Property="MousePressedForeground" Value="#555"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Border>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Image Source="TemplateBinding Icon" Stretch="None"/>
<TextBlock x:Name="Txt" Text="TemplateBinding Content" Foreground="TemplateBinding Foreground" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Binding MouseOverForeground,RelativeSource=RelativeSource TemplatedParent" TargetName="Txt"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Foreground" Value="Binding MousePressedForeground,RelativeSource=RelativeSource TemplatedParent" TargetName="Txt"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ButtonType" Value="Path">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Background" Value="Transparent"/>
<Setter Property="Foreground" Value="#fff"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Border Focusable="False" VerticalAlignment="Center" HorizontalAlignment="Center" Width="TemplateBinding Width" Height="TemplateBinding Height" Background="TemplateBinding Background" CornerRadius="TemplateBinding CornerRadius">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" HorizontalAlignment="Center">
<Path Data="TemplateBinding PathData" Width="TemplateBinding PathWidth" Height="TemplateBinding PathHeight" Fill="TemplateBinding Foreground" Stretch="Fill" />
<TextBlock x:Name="txt" Text="TemplateBinding Content" Foreground="TemplateBinding Foreground" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.8"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value="0.9"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="ButtonType" Value="Content">
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Border Width="TemplateBinding Width" Height="TemplateBinding Height" Background="TemplateBinding Background" CornerRadius="TemplateBinding CornerRadius">
<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="IsMouseOver" Value="True">
<Setter Property="Opacity" Value="0.8"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Opacity" Value="0.9"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="x:Type local:ButtonEx" x:Key="pageButton">
<Setter Property="Background" Value="StaticResource BuyMianColor"/>
<Setter Property="MouseOverBackground" Value="#2f96b4"/>
<Setter Property="MousePressedBackground" Value="#2a89a4"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="MouseOverForeground" Value="White"/>
<Setter Property="MousePressedForeground" Value="White"/>
<Setter Property="BorderBrush" Value="Transparent"/>
<Setter Property="BorderThickness" Value="0"/>
<Setter Property="FontSize" Value="20"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="x:Type local:ButtonEx">
<Grid>
<Border x:Name="border" Background="TemplateBinding Background" CornerRadius="2" BorderBrush="TemplateBinding BorderBrush" BorderThickness="0" Width="300" Height="60" SnapsToDevicePixels="True">
<Border.Effect>
<DropShadowEffect ShadowDepth="4" BlurRadius="2" Opacity="0.5" Color="#000"/>
</Border.Effect>
</Border>
<TextBlock x:Name="txt" Text="TemplateBinding Content" Foreground="TemplateBinding Foreground" VerticalAlignment="Center" HorizontalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="border" Property="Background" Value="Binding MouseOverBackground,RelativeSource=RelativeSource TemplatedParent"/>
<Setter TargetName="txt" Property="Foreground" Value="Binding MouseOverForeground,RelativeSource=RelativeSource TemplatedParent"/>
<Setter TargetName="border" Property="BorderBrush" Value="Binding MouseOverBorderbrush,RelativeSource=RelativeSource TemplatedParent"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="border" Property="Background" Value="Binding MousePressedBackground,RelativeSource=RelativeSource TemplatedParent"/>
<Setter TargetName="txt" Property="Foreground" Value="Binding MousePressedForeground,RelativeSource=RelativeSource TemplatedParent"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="border" Property="Background" Value="StaticResource ButtonBlackColor"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
以上是关于wpf 自定义Button按钮的主要内容,如果未能解决你的问题,请参考以下文章