ButtonEx 按钮控件

ButtonEx 是一个功能丰富的按钮控件,支持多种形状、颜色类型、SVG图标、悬停效果等功能。适用于表单提交、操作触发、导航跳转等场景。

ButtonEx 按钮控件

控件名称

ButtonEx

中文名称

按钮控件

控件优点

ButtonEx 是一个功能丰富的按钮控件,支持多种形状、颜色类型、SVG图标、悬停效果等功能。适用于表单提交、操作触发、导航跳转等场景。

主要特性

  • 多种形状:支持默认、圆形、圆角矩形等多种形状
  • 颜色类型:支持默认、主要、成功、警告、错误、信息等多种颜色类型(使用 Ant Design 功能色)
  • SVG图标:支持SVG图标显示和旋转
  • 图标位置:支持多种图标位置
  • 悬停效果:支持悬停和按下状态的颜色变化
  • 主题支持:实现 IThemeable 接口,支持亮暗主题自动切换(FollowGlobalTheme 属性)
  • 数据绑定:实现 INotifyPropertyChanged 接口

重要参数说明

基本属性

属性名 类型 默认值 说明
Text string "" 按钮文本
Shape ButtonShape Default 按钮形状
CornerRadius int 6 圆角半径(Shape=Default时生效)
Type ColorType Default 颜色类型
Enabled bool true 是否可用

按钮形状(ButtonShape)

形状值 说明
Default 默认圆角矩形
Circle 圆形
Round 完全圆角矩形

圆角半径(CornerRadius)

属性名 类型 默认值 说明
CornerRadius int 6 圆角半径,仅当Shape=Default时生效。0表示使用自动计算(高度一半或15像素取小值)

颜色类型(ColorType)

类型值 说明 颜色值
Default 默认 #018b8d (马尔斯绿)
Primary 主要 #1890ff (Ant Design 品牌主色)
Success 成功 #52c41a (Ant Design 成功色)
Warning 警告 #faad14 (Ant Design 警告色)
Error 错误 #f5222d (Ant Design 错误色)
Info 信息 #1890ff (Ant Design 链接色)

流行色系(11种)

类型值 说明 颜色值 特性
BurgundyRed 勃艮第红 #470125 高贵、优雅、感性
KleinBlue 克莱因蓝 #002fa7 希望、自由、理智
MarsGreen 马尔斯绿 #018b8d 奢华、神秘、力量
TitianRed 提香红 #d34947 典雅、艺术、理智
HermesOrange 爱马仕橙 #eb5c20 活力、时尚、温暖
LimeGreen 莱姆绿 #6ecc54 生机、自然、平衡
PrussianBlue 普鲁士蓝 #0d3a69 绅士、优雅、内敛
VanDykeBrown 凡戴克棕 #492d22 权力、深沉、厚重
ChineseRed 中国红 #c8161d 热情、福禄、高贵
TiffanyBlue 蒂芙尼蓝 #71e2d1 清澈、自由、浪漫
SchonbrunnerYellow 申布伦黄 #f9d46c 奢华、阳光、明亮

颜色属性

属性名 类型 默认值 说明
ShellColor Color 240, 240, 240 外壳颜色
ButtonColor Color 1, 139, 141 (#018b8d) 按钮颜色(Type=Default时生效,默认马尔斯绿)
BorderColor Color 1, 139, 141 (#018b8d) 边框颜色(Type=Default时生效,默认马尔斯绿)
HoverColor Color 26, 164, 166 悬停颜色(Type=Default时自动基于ButtonColor变亮)
PressedColor Color 0, 111, 113 按下颜色(Type=Default时自动基于ButtonColor变暗)
PressedBorderColor Color 0, 111, 113 按下边框颜色

图标属性

属性名 类型 默认值 说明
IconSvgName string "windows" SVG图标名称
IconSvgColor Color? null 图标颜色(null自动跟随按钮文字颜色)
IconSvgRotation float 0 图标旋转角度
IconPosition IconPosition Left 图标位置
IconSize int 0 图标大小(0自动)
IconGap float 0.2f 图标与文本间距比例

图标颜色自动跟随规则

IconSvgColornull 时,图标颜色会自动跟随文本颜色:

按钮类型 图标颜色
Primary / Success / Warning / Error / Info 白色
深色背景流行色(除蒂芙尼蓝、申布伦黄外) 白色
浅色背景流行色(蒂芙尼蓝、申布伦黄) 黑色
Default 根据背景色亮度自动计算(深色背景用白色,浅色背景用黑色)

图标位置(IconPosition)

位置值 说明
Left 左侧
Right 右侧
Top 顶部
Bottom 底部

显示样式(DisplayStyle)

样式值 说明
Default 图片+文本(默认)
ImageOnly 仅图片
TextOnly 仅文本

幽灵按钮

属性名 类型 默认值 说明
Ghost bool false 幽灵按钮,背景透明只显示边框

箭头

属性名 类型 默认值 说明
ShowArrow bool false 显示箭头
IsLink bool false 箭头链接样式(右箭头)

自动大小

属性名 类型 默认值 说明
AutoSize bool false 自动调整大小
AutoSizeMode AutoSizeMode None 自动大小模式

AutoSizeMode 枚举

说明
None 禁用自动大小
Auto 宽度和高度都自动调整
Width 仅宽度自动调整
Height 仅高度自动调整

Toggle 切换功能

属性名 类型 默认值 说明
AutoToggle bool false 点击时自动改变选中状态
Toggle bool false 选中状态
ToggleIconSvgName string? null 切换图标SVG名称
ToggleIconSvgNameHover string? null 切换悬停图标SVG名称
IconToggleAnimation int 200 图标切换动画时长(毫秒)
ToggleFore Color? null 切换文字颜色
ToggleForeHover Color? null 切换悬停文字颜色
ToggleForeActive Color? null 切换激活文字颜色
ToggleType ButtonToggleType None 切换类型
ToggleBack Color? null 切换背景颜色
ToggleBackExtend string? null 切换背景渐变色
ToggleBackHover Color? null 切换悬停背景颜色
ToggleBackActive Color? null 切换激活背景颜色

ButtonToggleType 枚举(可选)

注意:只要设置了 ToggleIconSvgNameToggleBack/ToggleBackActive,切换功能就会自动生效,ToggleType 属性主要用于向后兼容。

说明
None 无切换
Icon 仅图标切换
Background 背景色切换
IconAndBackground 图标+背景切换

其他属性

属性名 类型 默认值 说明
Gap int 0 按键体与外壳间隙

主题属性

属性名 类型 默认值 说明
FollowGlobalTheme bool true 是否跟随全局主题(亮暗模式切换)
IsDark bool false 只读,当前是否为暗色模式

主题说明:ButtonEx 实现 IThemeable 接口,构造时自动注册到 ThemeManager。当 FollowGlobalTheme = true 时,主题切换会自动保存用户原始颜色并在暗色模式下调整背景色/文字色。用户手动设置的颜色(ButtonColor、BorderColor 等)会被标记,主题切换时不会覆盖用户自定义颜色。

重要事件

事件名 说明
Click 点击时触发
PropertyChanged 属性值改变时触发
ToggleChanged Toggle 状态改变时触发(参数 bool 表示新状态)

使用示例

基本使用

// 创建按钮
ButtonEx button = new ButtonEx();
button.Text = "点击我";
button.Size = new Size(120, 40);
this.Controls.Add(button);

// 点击事件
button.Click += (sender, e) =>
{
    MessageBox.Show("按钮被点击!");
};

不同形状

// 默认形状
button1.Shape = ButtonShape.Default;

// 圆形按钮
button2.Shape = ButtonShape.Circle;
button2.Size = new Size(60, 60);

// 完全圆角矩形
button3.Shape = ButtonShape.Round;

自定义圆角半径

// 设置圆角半径为10像素
button1.CornerRadius = 10;

// 设置圆角半径为0(直角矩形,使用自动计算)
button2.CornerRadius = 0;

颜色类型(Ant Design 功能色)

// 默认类型 - #018b8d(马尔斯绿)
button1.Type = ColorType.Default;

// 主要类型 - #1890ff
button2.Type = ColorType.Primary;

// 成功类型 - #52c41a
button3.Type = ColorType.Success;

// 警告类型 - #faad14
button4.Type = ColorType.Warning;

// 错误类型 - #f5222d
button5.Type = ColorType.Error;

// 信息类型 - #1890ff
button6.Type = ColorType.Info;

流行色系(11种)

// 勃艮第红 - #470125
button.Type = ColorType.BurgundyRed;

// 克莱因蓝 - #002fa7
button.Type = ColorType.KleinBlue;

// 马尔斯绿 - #018b8d
button.Type = ColorType.MarsGreen;

// 提香红 - #d34947
button.Type = ColorType.TitianRed;

// 爱马仕橙 - #eb5c20
button.Type = ColorType.HermesOrange;

// 莱姆绿 - #6ecc54
button.Type = ColorType.LimeGreen;

// 普鲁士蓝 - #0d3a69
button.Type = ColorType.PrussianBlue;

// 凡戴克棕 - #492d22
button.Type = ColorType.VanDykeBrown;

// 中国红 - #c8161d
button.Type = ColorType.ChineseRed;

// 蒂芙尼蓝 - #71e2d1(浅色背景,使用黑色文字)
button.Type = ColorType.TiffanyBlue;

// 申布伦黄 - #f9d46c(浅色背景,使用黑色文字)
button.Type = ColorType.SchonbrunnerYellow;

图标按钮

// 带图标的按钮
button.IconSvgName = "search";
button.IconPosition = IconPosition.Left;
button.IconSize = 20;

// 仅图标按钮
button.DisplayStyle = ButtonDisplayStyle.ImageOnly;
button.IconSvgName = "home";
button.Size = new Size(40, 40);

// 旋转图标
button.IconSvgRotation = 45f;

图标颜色自动跟随

// 不设置 IconSvgColor(保持null)时,图标颜色会自动跟随按钮类型:

// Primary/Success/Warning/Error/Info 类型 → 图标为白色
button.Type = ColorType.Primary;
button.IconSvgName = "play";  // 图标显示为白色

button.Type = ColorType.Warning;
button.IconSvgName = "warning";  // 图标显示为白色

// Default 类型 → 图标使用 ForeColor(默认黑色)
button.Type = ColorType.Default;
button.IconSvgName = "setting";  // 图标显示为 ForeColor 颜色

// 如需自定义图标颜色,可显式设置 IconSvgColor:
button.Type = ColorType.Primary;
button.IconSvgName = "star";
button.IconSvgColor = Color.Yellow;  // 强制显示黄色图标

自定义颜色(Type=Default时生效)

// 设置颜色
button.Type = ColorType.Default;
button.ShellColor = Color.LightGray;
button.ButtonColor = Color.White;
button.BorderColor = Color.Gray;
button.HoverColor = Color.LightBlue;
button.PressedColor = Color.Blue;

图标位置

// 图标在左侧(默认)
button.IconPosition = IconPosition.Left;

// 图标在右侧
button.IconPosition = IconPosition.Right;

// 图标在顶部
button.IconPosition = IconPosition.Top;

// 图标在底部
button.IconPosition = IconPosition.Bottom;

数据绑定

// 属性改变事件
button.PropertyChanged += (sender, e) =>
{
    Console.WriteLine($"属性 {e.PropertyName} 已更改");
};

幽灵按钮(Ghost)

// 幽灵按钮 - 背景透明,显示边框
button.Ghost = true;
button.Type = ColorType.Primary;

// 幽灵链接样式 - 带下划线
button.Ghost = true;
button.IsLink = true;

箭头按钮

// 下拉箭头按钮
button.ShowArrow = true;

// 链接箭头按钮(右箭头)
button.ShowArrow = true;
button.IsLink = true;

自动大小

// 启用自动大小
button.AutoSize = true;
button.AutoSizeMode = AutoSizeMode.Auto;  // 宽高都自动

// 仅宽度自动
button.AutoSize = true;
button.AutoSizeMode = AutoSizeMode.Width;

Toggle 切换按钮

// 自动切换按钮
button.AutoToggle = true;
button.ToggleChanged += (sender, isToggled) =>
{
    Console.WriteLine($"切换状态: {isToggled}");
};

// 图标切换(设置 ToggleIconSvgName 即可自动切换图标)
button.AutoToggle = true;
button.IconSvgName = "heart-o";      // 未选中图标
button.ToggleIconSvgName = "heart";  // 选中图标

// 背景色切换(设置 ToggleBack 或 ToggleBackActive)
button.AutoToggle = true;
button.ToggleBackActive = Color.Red;  // 选中时的背景色

// 图标+背景同时切换
button.AutoToggle = true;
button.IconSvgName = "star-o";
button.ToggleIconSvgName = "star";
button.ToggleBackActive = Color.Yellow;

显示样式

// 仅文本
button.DisplayStyle = ButtonDisplayStyle.TextOnly;

// 仅图标
button.DisplayStyle = ButtonDisplayStyle.ImageOnly;

// 图文(默认)
button.DisplayStyle = ButtonDisplayStyle.Default;

注意事项

  1. 形状选择:不同形状需要调整控件尺寸以保证显示效果
  2. 颜色类型:Type 属性会覆盖 ButtonColor、HoverColor、PressedColor 设置
  3. 图标大小:IconSize 为 0 时会自动计算合适大小(按钮高度的70%)
  4. 显示样式:DisplayStyle 为 ImageOnly 时只显示图标,TextOnly 时只显示文本
  5. Ant Design 颜色:Primary、Success、Warning、Error、Info 类型使用 AntDesignColors 类中定义的颜色值
  6. 圆角半径:CornerRadius 仅在 Shape=Default 时生效,设置为0时使用自动计算(高度一半或15像素取小值)
  7. 禁用状态:Enabled 为 false 时按钮不可点击,鼠标悬停显示禁用样式(Cursor.No)

版本更新

2026-08-08

  • 新增:实现 IThemeable 接口,支持 FollowGlobalTheme 属性(默认 true),自动跟随全局亮暗主题切换
  • 新增:构造函数自动注册到 ThemeManager,Dispose 时自动注销
  • 新增:用户手动设置颜色时自动标记(_isButtonColorSetByUser 等),主题切换不覆盖用户自定义颜色
  • 新增:多框架兼容支持(net8.0-windows 和 net48)
  • 优化:暗色模式下自动调整背景色和文字色,确保可读性

2025-05-28

  • 新增:11种流行色系(勃艮第红、克莱因蓝、马尔斯绿、提香红、爱马仕橙、莱姆绿、普鲁士蓝、凡戴克棕、中国红、蒂芙尼蓝、申布伦黄)
  • 修复:默认类型(Type=Default)背景色改为马尔斯绿(#018b8d)
  • 修复:图标颜色自动跟随文本颜色,确保与背景色形成对比
  • 修复:Type=Default 时悬停和按下状态颜色基于背景色动态计算(变亮/变暗15%)
  • 修复:Type=Default 时文本颜色根据背景色亮度自动计算对比色
  • 修复:主题切换时不再重置用户自定义的颜色设置

2025-05-02

  • 新增:CornerRadius 属性,支持自定义圆角半径(默认值为6)