# CheckBox 复选框 ## 概述 复选框(CheckBox)用于在一组选项中进行多选操作,允许用户从多个备选项中选择零个或多个。它支持三种状态:选中(Checked)、未选中(Unchecked)和半选中/不确定态(Indeterminate),半选态常用于实现「全选/部分选」的级联交互。 AtomUI 的 `CheckBox` 控件复刻了 [Ant Design 5.0 Checkbox](https://ant.design/components/checkbox-cn) 的设计规范,在 .NET / Avalonia 平台上提供与 Ant Design React 版一致的视觉体验和交互行为。 --- ## 设计原理 ### Ant Design 的复选框设计哲学 Ant Design 对复选框的定位是:**「在一组可选项中进行多项选择」**。其核心交互特征包括: 1. **独立使用** — 单个复选框表示两种状态(选中/未选中)之间的切换 2. **分组使用** — 多个复选框组成一组,用户可从中选择零个或多个选项 3. **全选联动** — 通过 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) | 对齐情况 | |---|---|---|---| | 基本复选框 | ✅ `` | ✅ `` | ✅ 完全对齐 | | 禁用 `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] └── ... ```