# ColorPicker 使用文档
本文档介绍 AtomUI ColorPicker 控件的各种使用方式,示例代码摘自 Gallery 演示程序。
> 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/DataEntry/ColorPickerShowCase.axaml`
---
## 前置准备
在 AXAML 中使用 ColorPicker,需要引入以下命名空间:
```xml
xmlns:atom="https://atomui.net"
```
在 C# 代码中引入:
```csharp
using AtomUI.Desktop.Controls; // ColorPicker、GradientColorPicker
using AtomUI.Controls; // SizeType 等共享类型
```
---
## 1. 基本用法
最简单的颜色选择器,点击触发器即可弹出颜色面板:
```xml
```
- `DefaultValue` 设置初始颜色值
- 点击触发器弹出 Flyout 面板,面板中包含色谱、色相滑块、输入框等
---
## 2. 触发器尺寸
通过 `SizeType` 属性设置触发器尺寸,支持 `Small`、`Middle`(默认)、`Large` 三种:
```xml
```
**提示**:尺寸影响触发器色块的大小和内间距,不影响 Flyout 面板的大小。
---
## 3. 受控模式
通过 `ValueSyncStrategy` 属性控制颜色值的同步时机:
| 模式 | 说明 |
|---|---|
| `Immediate`(默认) | 拖动滑块时实时更新 `Value`,触发 `ValueChanged` 事件 |
| `OnCompleted` | 仅在关闭 Flyout 面板时更新 `Value`,触发 `ValueSelected` 事件 |
```xml
```
**使用场景**:
- `Immediate`:需要实时预览颜色效果的场景(如实时修改背景色)
- `OnCompleted`:只在用户确认选择后才生效的场景(如提交表单)
---
## 4. 渐变色选择
使用 `GradientColorPicker` 选取线性渐变色,支持多色标(GradientStop)编辑:
```xml
```
**渐变色选择器面板功能**:
- 渐变预览条:显示当前渐变效果
- 色标指示器:可拖动调整位置,点击选中编辑颜色
- 添加/删除色标
- 色谱和滑块:编辑选中色标的颜色
> 📖 与 Ant Design 的区别:Ant Design 通过 `mode` 属性切换纯色/渐变模式,AtomUI 将其拆分为两个独立控件(`ColorPicker` 和 `GradientColorPicker`),更符合 Avalonia 的类型系统。
---
## 5. 触发器文本
通过 `IsShowText="True"` 在触发器上显示颜色文本值:
```xml
```
### 自定义文本格式化
通过 `ColorTextFormatter` 附加属性自定义触发器文本渲染:
```xml
```
```csharp
// 在 Code-behind 或 ViewModel 中设置
var colorPicker = this.FindControl("CustomRenderText");
ColorPicker.SetColorTextFormatter(colorPicker, (color, format) =>
{
var hex = ColorToHexConverter.ToHexString(color, AlphaComponentPosition.Leading, false, true);
return $"🎨 {hex}";
});
```
**文本内容随 `Format` 属性变化**:
- `Hex`:显示 `#1677ff`
- `Hsva`:显示 `hsva(217, 100%, 100%, 1.00)`
- `Rgba`:显示 `rgba(22, 119, 255, 1.00)`
---
## 6. 禁用状态
通过 `IsEnabled="False"` 禁用颜色选择器:
```xml
```
禁用时触发器变灰,不可点击,Flyout 不会弹出。
---
## 7. 禁用 Alpha 通道
通过 `IsAlphaEnabled="False"` 隐藏透明度滑块,仅允许选取不透明色:
```xml
```
禁用 Alpha 通道后:
- Flyout 面板中不显示透明度滑块
- 输入区域中不显示 Alpha 输入框
- 颜色值的 Alpha 分量始终为 1.0
---
## 8. 清除颜色
通过 `IsClearEnabled="True"` 允许用户清除已选颜色:
```xml
```
清除颜色后:
- 触发器色块显示透明棋盘格背景(表示无颜色)
- `Value` 变为 `null`
- 可通过 `EmptyColorText` 属性自定义空状态文本
---
## 9. 触发方式
通过 `TriggerType` 属性设置 Flyout 的触发方式:
| 触发方式 | 说明 |
|---|---|
| `Click`(默认) | 点击触发器弹出面板 |
| `Hover` | 鼠标悬浮触发器弹出面板 |
```xml
```
---
## 10. 颜色格式
通过 `Format` 属性设置颜色编码格式,支持 `Hex`(默认)、`Hsva`、`Rgba`:
```xml
```
**格式影响范围**:
- 触发器文本显示(当 `IsShowText=True`)
- Flyout 面板中输入框的显示格式
当 `IsFormatEnabled="True"`(默认)时,用户可在面板中点击格式切换按钮自由切换格式。
---
## 11. 预设色板
通过 `IsPaletteGroupEnabled="True"` 启用预设色板,面板底部会显示 Ant Design 标准色板:
```xml
```
### 自定义预设色板
通过 `PaletteGroup` 属性设置自定义预设色组:
```csharp
var customPalettes = new List
{
new("品牌色", new List
{
Color.FromRgb(0x16, 0x77, 0xff),
Color.FromRgb(0x09, 0x58, 0xf9),
Color.FromRgb(0x3c, 0x86, 0xff),
}),
new("主题色", new List
{
Color.FromRgb(0x52, 0xc4, 0x1a),
Color.FromRgb(0xfa, 0xad, 0x14),
Color.FromRgb(0xff, 0x4d, 0x4f),
}),
};
colorPicker.PaletteGroup = customPalettes;
```
---
## 12. 样式变体
通过 `StyleVariant` 属性设置触发器的样式变体,与 Input 控件的样式系统对齐:
```xml
```
---
## 13. 输入状态
通过 `Status` 属性设置输入控件状态,用于表单验证反馈:
```xml
```
**使用场景**:通常由 FormItem 自动管理,无需手动设置。当表单验证失败时,FormItem 会自动将 ColorPicker 的 `Status` 设为 `Error`。
---
## 14. MVVM 数据绑定
ColorPicker 支持标准的 Avalonia 数据绑定模式:
### 绑定颜色值
```xml
```
```csharp
// ViewModel(使用 ReactiveUI)
[Reactive]
public Color? ThemeColor { get; set; } = Color.FromRgb(0x16, 0x77, 0xff);
[Reactive]
public LinearGradientBrush? GradientBackground { get; set; }
```
### 监听颜色变化
```xml
```
```csharp
// Code-behind
public void HandleColorChanged(object? sender, ColorChangedEventArgs e)
{
// 实时响应颜色变化(Immediate 模式下拖动时持续触发)
var newColor = e.NewColor;
PreviewBorder.Background = new SolidColorBrush(newColor ?? Colors.Transparent);
}
public void HandleColorSelected(object? sender, ColorSelectedEventArgs e)
{
// 用户确认选择(Flyout 关闭时触发)
var selectedColor = e.SelectedColor;
ApplyColor(selectedColor);
}
```
### 命令绑定
```xml
```
---
## 15. Flyout 弹出位置
通过 `Placement` 属性控制 Flyout 的弹出位置:
```xml
```
---
## 16. 控制动画行为
```xml
```
---
## 常见组合模式
### 表单集成
ColorPicker 实现了 `IFormItemAware` 接口,可直接在 Form 中使用:
```xml
```
### 紧凑空间
ColorPicker 实现了 `ICompactSpaceAware` 接口,可在 `Space.Compact` 中使用:
```xml
Apply
```
### 实时预览
结合 `ValueSyncStrategy="Immediate"` 和 `ValueChanged` 事件实现实时预览:
```xml
```
```csharp
public void HandleColorChanged(object? sender, ColorChangedEventArgs e)
{
PreviewBorder.Background = new SolidColorBrush(e.NewColor ?? Colors.Transparent);
}