WPF 自定义按钮类实现

1.创建自定义按钮类 (CustomButton.cs)

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace WPF_LoginUI
{
    // 自定义按钮类
    public class CustomButton : Button
    {
        // propdp
        // 依赖属性  CustomButtomStyles.xaml 绑定相关 ButtonCornerRadius 属性 ==> MainWindow.xaml 使用

        // 自定义属性 圆角半径 
        public CornerRadius ButtonCornerRadius
        {
            get { return (CornerRadius)GetValue(ButtonCornerRadiusProperty); }
            set { SetValue(ButtonCornerRadiusProperty, value); }
        }
        public static readonly DependencyProperty ButtonCornerRadiusProperty =
            DependencyProperty.Register("ButtonCornerRadius", typeof(CornerRadius), typeof(CustomButton));

        // 自定义属性 鼠标掠过颜色
        public Brush BackgroundHover
        {
            get { return (Brush)GetValue(BackgroundHoverProperty); }
            set { SetValue(BackgroundHoverProperty, value); }
        }
        public static readonly DependencyProperty BackgroundHoverProperty =
            DependencyProperty.Register("BackgroundHoverProperty", typeof(Brush), typeof(CustomButton));


        // 自定义属性 鼠标按下颜色
        public Brush BackgroundPressed
        {
            get { return (Brush)GetValue(BackgroundPressedProperty); }
            set { SetValue(BackgroundPressedProperty, value); }
        }
        public static readonly DependencyProperty BackgroundPressedProperty =
            DependencyProperty.Register("BackgroundPressed", typeof(Brush), typeof(CustomButton));
    }
}

2.创建自定义按钮 样式xaml文件(CustomButtomStyles.xaml)

xml 复制代码
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"         
                    xmlns:bb="clr-namespace:WPF_LoginUI">
    <!--使用关联的类 -->
    <Style TargetType="{x:Type bb:CustomButton}">
        <Setter Property="Template">
            <Setter.Value>
                <!--关联自定义类-->
                <ControlTemplate TargetType="{x:Type bb:CustomButton}">
                    <!-- 外框相关属性 Background 绑定既有属性 CornerRadius 绑定自定义属性-->
                    <Border x:Name="buttonBorder" 
                            Background="{TemplateBinding Background}" 
                            CornerRadius="{TemplateBinding ButtonCornerRadius}">
                            <!-- 中间文本框 绑定按钮自带属性 -->
                            <TextBlock Text="{TemplateBinding Content}" 
                                   HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                   VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                    </Border>
                    <!--触发器-->
                    <ControlTemplate.Triggers>
                        <!-- 触发器 鼠标掠过-->
                        <Trigger Property="IsMouseOver" Value="True">
                            <!-- 发生触发 修改Border的背景属性 -->
                            <Setter TargetName="buttonBorder" Property="Background" 
                                    Value="{Binding BackgroundHover, RelativeSource={RelativeSource TemplatedParent}}"></Setter>
                        </Trigger>
                        <!-- 触发器 鼠标按下-->
                        <Trigger Property="IsPressed" Value="True">
                            <!-- 发生触发 修改Border的背景属性 -->
                            <Setter TargetName="buttonBorder" Property="Background" 
                                    Value="{Binding BackgroundPressed, RelativeSource={RelativeSource TemplatedParent}}"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>

        </Setter>
    </Style>
</ResourceDictionary>

3.项目添加样式文件

xml 复制代码
<Application x:Class="WPF_LoginUI.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_LoginUI"
             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <!--添加自定义按钮样式 字典文件-->
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="CustomButtomStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

4.使用自定义按钮

xml 复制代码
<!-- 第四行 登录按钮 -->
<local:CustomButton x:Name="BtnLogin" Background="#3C7FF8" Grid.Row="3" Grid.Column="0" 
                    Foreground="Wheat" 
                    BackgroundHover="red"
                    BackgroundPressed="Green"
                    FontSize="20"
                    ButtonCornerRadius="5"
                    Content="登录" Grid.ColumnSpan="2" 
                    HorizontalContentAlignment="Center"
                    VerticalContentAlignment="Center"
        Command="{Binding LoginAction}"/>
相关推荐
小白21 小时前
WPF自定义Dialog模板,内容用不同的Page填充
wpf
Crazy Struggle1 天前
C# + WPF 音频播放器 界面优雅,体验良好
c#·wpf·音频播放器·本地播放器
James.TCG2 天前
WPF动画
wpf
He BianGu2 天前
笔记:简要介绍WPF中FormattedText是什么,主要有什么功能
笔记·c#·wpf
脚步的影子2 天前
.NET 6.0 + WPF 使用 Prism 框架实现导航
.net·wpf
jyl_sh3 天前
Ribbon (WPF)
ribbon·wpf·client·桌面程序开发·c/s客户端
wo63704313 天前
[Visual Stuidio 2022使用技巧]2.配置及常用快捷键
c#·.net·wpf
小黄人软件3 天前
wpf 字符串 与 变量名或函数名 相互转化:反射
wpf
界面开发小八哥3 天前
DevExpress WPF中文教程:如何解决排序、过滤遇到的常见问题?(二)
.net·wpf·界面控件·devexpress·ui开发
Vae_Mars3 天前
WPF中图片的宫格显示
wpf