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按钮的主要内容,如果未能解决你的问题,请参考以下文章

WPF自定义控件之带倒计时的按钮--Button

wpf 自定义按钮

WPF 自定义窗口关闭按钮

WPF自定义Button控件

WPF自定义控件,自定义控件中由多个button组成,如何给每个button添加不同事件处理?

关于WPF添加按钮