8.6 KiB
CheckBox 复选框
概述
复选框(CheckBox)用于在一组选项中进行多选操作,允许用户从多个备选项中选择零个或多个。它支持三种状态:选中(Checked)、未选中(Unchecked)和半选中/不确定态(Indeterminate),半选态常用于实现「全选/部分选」的级联交互。
AtomUI 的 CheckBox 控件复刻了 Ant Design 5.0 Checkbox 的设计规范,在 .NET / Avalonia 平台上提供与 Ant Design React 版一致的视觉体验和交互行为。
设计原理
Ant Design 的复选框设计哲学
Ant Design 对复选框的定位是:「在一组可选项中进行多项选择」。其核心交互特征包括:
- 独立使用 — 单个复选框表示两种状态(选中/未选中)之间的切换
- 分组使用 — 多个复选框组成一组,用户可从中选择零个或多个选项
- 全选联动 — 通过 Indeterminate 半选态实现「全选/部分选」的级联交互
设计建议(来自 Ant Design):
- 单独使用时,用于选择一个或取消一个选项
- 集合使用时,用于收集用户的多项偏好
- 不要使用复选框来替代开关(Switch),复选框侧重于"收集选择",开关侧重于"立即切换"
Avalonia CheckBox 基础能力
AtomUI 的 CheckBox 继承自 Avalonia 框架的 Avalonia.Controls.CheckBox(通过 AbstractCheckBox 中间层)。Avalonia CheckBox 继承自 ToggleButton,支持三态切换。其继承链为:
Control → TemplatedControl → ContentControl → Button → ToggleButton → CheckBox
Avalonia CheckBox 提供的基础属性:
| 属性 | 说明 |
|---|---|
Content |
复选框旁的文本内容 |
IsChecked |
选中状态:true(选中)、false(未选中)、null(不确定态) |
IsThreeState |
是否启用三态模式(允许 null 状态) |
Command / CommandParameter |
MVVM 命令绑定 |
Avalonia CheckBox 提供的基础伪类:
| 伪类 | 说明 |
|---|---|
:checked |
选中状态 |
:unchecked |
未选中状态 |
:indeterminate |
不确定态(半选) |
:pointerover |
鼠标悬浮 |
:pressed |
按下 |
:disabled |
禁用 |
AtomUI 的扩展设计
AtomUI CheckBox 在 Avalonia CheckBox 的基础上,遵循 Ant Design 5.0 规范做了以下扩展:
| 扩展能力 | 实现方式 | 设计动机 |
|---|---|---|
| 自定义指示器 | CheckBoxIndicator 内部控件 |
独立的选中/半选指示器,精确复刻 Ant Design 的勾选动画和圆角样式 |
| 点击波纹 | IWaveSpiritAwareControl + WaveSpiritDecorator |
复刻 Ant Design 的 Wave 点击涟漪效果 |
| 选中动画 | CheckedMarkRenderTransform + scale 过渡 |
选中时勾号从缩放 0.1 过渡到 1.0 的动画效果 |
| 复选框组 | CheckBoxGroup 容器控件 |
对齐 Ant Design 的 Checkbox.Group,支持分组管理、自动布局 |
| 数据驱动分组 | CheckBoxGroup.ItemsSource + ICheckBoxOption |
支持绑定数据集合生成复选框组 |
| 表单集成 | IFormItemAware 接口 |
可参与 FormItem 验证流程 |
| 过渡动画 | IsMotionEnabled |
全局动画开关 |
| Design Token | CheckBoxToken + RegisterTokenResourceScope |
所有视觉值从全局/组件级 Token 派生 |
功能详解
三种状态
CheckBox 支持三种选中状态:
| 状态 | IsChecked 值 |
视觉表现 | 典型用途 |
|---|---|---|---|
| 未选中 | false |
空白方框 | 默认状态 |
| 选中 | true |
蓝色背景 + 白色对勾 | 用户主动选择 |
| 不确定 | null |
白色背景 + 蓝色横杠 | 全选框部分子项被选中 |
默认为两态模式(IsThreeState = false),仅在 true ↔ false 之间切换。设置 IsThreeState = true 后启用三态循环:false → true → null → false。
复选框组(CheckBoxGroup)
CheckBoxGroup 是管理一组复选框的容器控件,提供统一的布局和选中状态管理:
- 支持
Orientation(水平/垂直排列) - 支持
ItemSpacing/LineSpacing控制间距 - 通过
CheckedItems属性获取/设置选中项集合 - 触发
CheckedChanged路由事件通知选中状态变化 - 支持
ItemsSource+ItemTemplate数据驱动模式
指示器动画
CheckBox 使用自定义 CheckBoxIndicator 控件渲染选中标记:
- 选中时:对勾图标从
scale(0.1)过渡到scale(1.0),产生弹入效果 - 半选时:显示蓝色横杠
- 波纹效果:点击时通过
WaveSpiritDecorator产生方形波纹动画
与 Ant Design 规范的对齐程度
| 特性 | Ant Design (React) | AtomUI (Avalonia) | 对齐情况 |
|---|---|---|---|
| 基本复选框 | ✅ <Checkbox> |
✅ <atom:CheckBox> |
✅ 完全对齐 |
禁用 disabled |
✅ 布尔属性 | ✅ IsEnabled |
✅ 完全对齐 |
三态 indeterminate |
✅ 布尔属性 | ✅ IsChecked=null + IsThreeState |
✅ 完全对齐 |
复选框组 Checkbox.Group |
✅ 组容器 | ✅ CheckBoxGroup |
✅ 完全对齐 |
分组选项 options |
✅ 数组配置 | ✅ ItemsSource + ICheckBoxOption |
✅ 完全对齐 |
onChange |
✅ 回调 | ✅ IsCheckedChanged / CheckedChanged 事件 |
✅ 完全对齐 |
| 全选联动 | ✅ 示例实现 | ✅ 通过 Indeterminate 态实现 | ✅ 完全对齐 |
继承关系
CheckBox
Avalonia.Controls.Primitives.TemplatedControl
└── Avalonia.Controls.ContentControl
└── Avalonia.Controls.Button
└── Avalonia.Controls.Primitives.ToggleButton
└── Avalonia.Controls.CheckBox
└── AtomUI.Controls.Commons.AbstractCheckBox
├── implements IWaveSpiritAwareControl
└── implements IFormItemAware
└── AtomUI.Desktop.Controls.CheckBox
CheckBoxGroup
Avalonia.Controls.Primitives.TemplatedControl
└── AtomUI.Controls.Commons.AbstractCheckBoxGroup
├── implements IMotionAwareControl
└── implements IFormItemAware
└── AtomUI.Desktop.Controls.CheckBoxGroup
实现的共享接口:
| 接口 | 控件 | 作用 |
|---|---|---|
IWaveSpiritAwareControl |
CheckBox | 支持点击涟漪(Wave)动画效果 |
IFormItemAware |
CheckBox / CheckBoxGroup | 可参与 FormItem 验证流程 |
IMotionAwareControl |
CheckBoxGroup | 支持 IsMotionEnabled 过渡动画开关 |
源码位置
| 层级 | 文件路径 | 说明 |
|---|---|---|
| 基类 | src/AtomUI.Controls/CheckBox/AbstractCheckBox.cs |
跨平台基类 |
| 基类 | src/AtomUI.Controls/CheckBox/AbstractCheckBoxGroup.cs |
复选框组跨平台基类 |
| 数据模型 | src/AtomUI.Controls/CheckBox/CheckBoxOption.cs |
ICheckBoxOption 接口和默认实现 |
| 控件类 | src/AtomUI.Desktop.Controls/CheckBox/CheckBox.cs |
桌面端 CheckBox |
| 控件类 | src/AtomUI.Desktop.Controls/CheckBox/CheckBoxGroup.cs |
桌面端 CheckBoxGroup |
| Token 定义 | src/AtomUI.Desktop.Controls/CheckBox/CheckBoxToken.cs |
组件级 Design Token |
| 主题模板 | src/AtomUI.Desktop.Controls/CheckBox/Themes/CheckBoxTheme.axaml |
CheckBox ControlTheme |
| 主题模板 | src/AtomUI.Desktop.Controls/CheckBox/Themes/CheckBoxGroupTheme.axaml |
CheckBoxGroup ControlTheme |
| 主题模板 | src/AtomUI.Desktop.Controls/CheckBox/Themes/CheckBoxIndicatorTheme.axaml |
指示器 ControlTheme |
| Gallery 示例 | controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/CheckBoxShowCase.axaml |
使用范例 |
模板结构
CheckBox 模板
Border#Frame (Padding=0,1,0,1)
└── DockPanel
├── CheckBoxIndicator#Indicator (DockPanel.Dock=Left) ← 选中指示器
│ └── Panel
│ ├── WaveSpiritDecorator (PART_WaveSpirit) ← 点击波纹
│ └── Border#Frame ← 指示器框架
│ └── Panel
│ ├── CheckBoldOutlined#CheckedMark ← 对勾图标(选中时可见)
│ └── Rectangle#TristateMark ← 横杠(半选时可见)
└── ContentPresenter#ContentPresenter ← 文本内容
CheckBoxGroup 模板
Border#Frame
└── CheckBoxItemsControl (PART_CheckBoxItems) ← 内部 SelectingItemsControl
└── WrapPanel ← 自动换行布局
├── CheckBox[0]
├── CheckBox[1]
└── ...