12 KiB
Icon 使用规范指南
本文档规范 AtomUI 项目中 Icon 的各种使用方式,涵盖 C# 代码和 AXAML 标记两个场景。
1. AXAML 中使用 Icon
1.1 命名空间声明
在 AXAML 文件头部添加 Ant Design 图标命名空间:
xmlns:antdicons="https://atomui.net/icons/antdesign"
约定: Ant Design 图标推荐前缀
antdicons,自定义图标包使用自己的前缀。
1.2 直接作为 XML 元素使用
最常用的方式——直接在 AXAML 中实例化图标控件:
<!-- 基础用法 -->
<antdicons:CheckCircleFilled />
<antdicons:LoadingOutlined />
<antdicons:SettingTwoTone />
<!-- 设置 Loading 动画 -->
<antdicons:LoadingOutlined LoadingAnimation="Spin" />
<!-- 自定义画刷颜色 -->
<antdicons:CheckCircleFilled
FillBrush="{atom:SharedTokenResource ColorSuccess}" />
<!-- TwoTone 图标设置双色 -->
<antdicons:SettingTwoTone
StrokeBrush="{atom:SharedTokenResource ColorPrimary}"
FillBrush="{atom:SharedTokenResource ColorInfoBg}" />
<!-- 设置尺寸 -->
<antdicons:SearchOutlined Width="24" Height="24" />
适用场景:在 ControlTheme 模板中直接放置图标、需要精细控制图标属性时。
1.3 通过 IconProvider MarkupExtension 使用
用于需要将图标赋值给 PathIcon? 类型属性的场景:
<!-- 基本用法 - 简写(省略 Kind=) -->
<atom:Button Icon="{antdicons:AntDesignIconProvider CloseOutlined}" />
<!-- 完整写法 -->
<atom:Button Icon="{antdicons:AntDesignIconProvider Kind=CheckCircleFilled}" />
<!-- 设置画刷和尺寸 -->
<atom:IconButton
Icon="{antdicons:AntDesignIconProvider Kind=DeleteOutlined,
FillBrush=Red, Width=16, Height=16}" />
<!-- 设置动画 -->
<atom:Button
Icon="{antdicons:AntDesignIconProvider Kind=LoadingOutlined,
Animation=Spin}" />
AntDesignIconProvider的构造函数接受一个AntDesignIconKind参数,因此{antdicons:AntDesignIconProvider CloseOutlined}是{antdicons:AntDesignIconProvider Kind=CloseOutlined}的简写形式。
适用场景:给控件的 Icon 属性赋值(如 Button.Icon、IconButton.Icon、MenuItem.Icon)。
1.4 在 IconTemplate 中使用
<atom:IconTemplate>
<antdicons:CloseOutlined />
</atom:IconTemplate>
适用场景:控件需要 IconTemplate 类型属性时(如 Tour 控件的关闭图标)。
1.5 主题文件中的典型模式
<ResourceDictionary
xmlns="https://github.com/avaloniaui"
xmlns:atom="https://atomui.net"
xmlns:antdicons="https://atomui.net/icons/antdesign">
<ControlTheme TargetType="atom:Alert">
<Setter Property="Template">
<ControlTemplate>
<!-- 多个图标按状态显示/隐藏 -->
<antdicons:CheckCircleFilled Name="SuccessIcon"
IsVisible="False" />
<antdicons:InfoCircleFilled Name="InfoIcon"
IsVisible="False" />
<antdicons:ExclamationCircleFilled Name="WarningIcon"
IsVisible="False" />
<antdicons:CloseCircleFilled Name="ErrorIcon"
IsVisible="False" />
</ControlTemplate>
</Setter>
<!-- 通过 Style Selector 控制可见性 -->
<Style Selector="^:success /template/ antdicons|CheckCircleFilled#SuccessIcon">
<Setter Property="IsVisible" Value="True" />
</Style>
</ControlTheme>
</ResourceDictionary>
注意: 在 Style Selector 中引用图标类型时,使用
antdicons|CheckCircleFilled语法(|分隔命名空间和类型名)。
2. C# 代码中使用 Icon
2.1 直接实例化
using AtomUI.Icons.AntDesign;
// 基础实例化
var icon = new CheckCircleFilled();
// 设置属性
var loadingIcon = new LoadingOutlined()
{
LoadingAnimation = IconAnimation.Spin
};
// 通过 SetCurrentValue 设置(推荐,保留属性优先级)
SetCurrentValue(IconProperty, new CloseCircleFilled());
// 通过 SetValue 设置(指定绑定优先级)
SetValue(IconProperty, new CheckCircleFilled(), BindingPriority.Template);
2.2 动态根据状态创建 Icon
using AtomUI.Icons.AntDesign;
// 根据状态选择不同图标
PathIcon? icon = notificationType switch
{
NotificationType.Success => new CheckCircleFilled(),
NotificationType.Information => new InfoCircleFilled(),
NotificationType.Warning => new ExclamationCircleFilled(),
NotificationType.Error => new CloseCircleFilled(),
_ => null
};
// 设置到控件属性
if (icon != null)
{
SetCurrentValue(IconProperty, icon);
}
2.3 带动画的 Loading 图标
using AtomUI.Icons.AntDesign;
using AtomUI.Controls;
// 创建旋转加载图标
SetCurrentValue(SuffixLoadingIconProperty, new LoadingOutlined()
{
LoadingAnimation = IconAnimation.Spin
});
2.4 IconFuncTemplate 用法
在代码中创建可复用的图标模板:
using AtomUI.Controls;
using AtomUI.Icons.AntDesign;
// 创建函数式图标模板
var iconTemplate = new IconFuncTemplate(() => new SearchOutlined());
3. Icon 属性体系速查
3.1 外观属性
| 属性 | 类型 | 说明 | 默认来源 |
|---|---|---|---|
Width / Height |
double |
图标尺寸 | SharedToken.IconSize |
StrokeBrush |
IBrush? |
主描边画刷(Outlined 主色) | SharedToken.ColorIconHover |
FillBrush |
IBrush? |
主填充画刷(Filled 主色) | SharedToken.ColorIconHover |
SecondaryStrokeBrush |
IBrush? |
次描边画刷(TwoTone 次色) | IconToken.SecondaryStrokeColor |
SecondaryFillBrush |
IBrush? |
次填充画刷(TwoTone 次色) | IconToken.SecondaryFillColor |
FallbackBrush |
IBrush? |
回退画刷 | White |
StrokeWidth |
double |
描边线宽 | IconToken.StrokeWidth (4) |
StrokeLineCap |
PenLineCap |
线端样式 | IconToken.StrokeLineCap (Round) |
StrokeLineJoin |
PenLineJoin |
线连接样式 | IconToken.StrokeLineJoin (Round) |
3.2 动画属性
| 属性 | 类型 | 说明 | 默认值 |
|---|---|---|---|
LoadingAnimation |
IconAnimation |
动画类型 | None |
LoadingAnimationDuration |
TimeSpan |
旋转周期 | 1s |
FillAnimationDuration |
TimeSpan |
颜色过渡时长 | 200ms(来自 MotionDurationMid token) |
IsMotionEnabled |
bool |
启用/禁用动画 | 来自 SharedToken.EnableMotion |
3.3 IconAnimation 枚举
| 值 | 效果 |
|---|---|
None |
无动画 |
Spin |
匀速旋转(平滑) |
Pulse |
步进旋转(8 步阶梯,类似 CSS steps(8)) |
4. 常见使用场景
4.1 按钮中的图标
<!-- 图标按钮 -->
<atom:Button Icon="{antdicons:AntDesignIconProvider SearchOutlined}"
ButtonType="Primary">
Search
</atom:Button>
<!-- 纯图标按钮 -->
<atom:IconButton Icon="{antdicons:AntDesignIconProvider DeleteOutlined}" />
<!-- Loading 按钮 -->
<atom:Button IsLoading="True" ButtonType="Primary">
Submitting
</atom:Button>
<!-- Button 内部会自动显示 LoadingOutlined 带 Spin 动画 -->
4.2 输入框中的图标
<!-- 带前缀/后缀图标 -->
<atom:TextBox>
<atom:TextBox.InnerLeftContent>
<antdicons:UserOutlined />
</atom:TextBox.InnerLeftContent>
</atom:TextBox>
4.3 提示信息中的状态图标
// NotificationCard / MessageCard 内部实现模式
PathIcon? icon = messageType switch
{
MessageType.Success => new CheckCircleFilled(),
MessageType.Error => new CloseCircleFilled(),
MessageType.Warning => new ExclamationCircleFilled(),
MessageType.Info => new InfoCircleFilled(),
MessageType.Loading => new LoadingOutlined()
{
LoadingAnimation = IconAnimation.Spin
},
_ => null
};
4.4 导航菜单中的图标
<atom:NavMenuItem Header="Dashboard"
Icon="{antdicons:AntDesignIconProvider DashboardOutlined}">
</atom:NavMenuItem>
4.5 进度条完成/异常图标
// 在控件内部设置默认图标
SetValue(SuccessCompletedIconProperty,
new CheckCircleFilled(), BindingPriority.Template);
SetValue(ExceptionCompletedIconProperty,
new CloseCircleFilled(), BindingPriority.Template);
5. 颜色控制最佳实践
5.1 通过 Token 系统控制颜色(推荐)
在主题文件中使用 Token 资源,确保 Icon 颜色跟随主题变化:
<!-- 使用全局 SharedToken -->
<antdicons:CheckCircleFilled
FillBrush="{atom:SharedTokenResource ColorSuccess}" />
<!-- 使用组件 Token -->
<antdicons:CloseOutlined
StrokeBrush="{atom:TokenResource NotificationCloseIconColor}" />
5.2 IconPresenter 统一颜色
当 Icon 嵌入在复杂控件中时,使用 IconPresenter 统一管理颜色:
<atom:IconPresenter Icon="{TemplateBinding Icon}"
IconBrush="{atom:SharedTokenResource ColorText}" />
IconPresenter 会自动将 IconBrush 同时绑定到子 Icon 的 StrokeBrush 和 FillBrush,无论图标是 Outlined 还是 Filled 类型都能正确着色。
5.3 TwoTone 图标颜色定制
<!-- 默认主题色 -->
<antdicons:SettingTwoTone />
<!-- 主色=ColorPrimary,次色=ColorInfoBg(由 IconTheme.axaml 定义) -->
<!-- 自定义双色 -->
<antdicons:HeartTwoTone
StrokeBrush="Red"
FillBrush="Pink" />
6. 编码规范与约定
6.1 命名空间导入
// 在 C# 中引用 Ant Design 图标
using AtomUI.Icons.AntDesign;
// 引用核心 Icon 类型
using AtomUI.Controls; // Icon, IconAnimation, IconThemeType, etc.
6.2 在控件代码中使用图标的规范
-
优先使用
SetCurrentValue设置图标,保留属性优先级链:SetCurrentValue(IconProperty, new CloseCircleFilled()); -
使用
SetValue+BindingPriority.Template设置模板级默认值:SetValue(IconProperty, new CheckCircleFilled(), BindingPriority.Template); -
不要在 AXAML 中硬编码图标颜色,始终使用 Token 资源引用
6.3 图标类命名约定
每个图标类的命名格式为 {IconName}{ThemeType}:
| 格式 | 示例 |
|---|---|
{Name}Filled |
CheckCircleFilled、HomeFilled |
{Name}Outlined |
SearchOutlined、LoadingOutlined |
{Name}TwoTone |
SettingTwoTone、HeartTwoTone |
6.4 Style Selector 中引用图标类型
在 AXAML Style Selector 中,使用 命名空间|类型名 语法:
<!-- 正确 -->
<Style Selector="^:success /template/ antdicons|CheckCircleFilled#SuccessIcon">
<!-- 带名称 -->
<Style Selector="/template/ antdicons|LoadingOutlined#LoadingIcon">
7. 常用图标参考
| 用途 | 推荐图标 |
|---|---|
| 成功状态 | CheckCircleFilled / CheckCircleOutlined |
| 错误状态 | CloseCircleFilled / CloseCircleOutlined |
| 警告状态 | ExclamationCircleFilled / ExclamationCircleOutlined |
| 信息状态 | InfoCircleFilled / InfoCircleOutlined |
| 加载中 | LoadingOutlined(配合 LoadingAnimation="Spin") |
| 关闭 | CloseOutlined |
| 搜索 | SearchOutlined |
| 删除 | DeleteOutlined |
| 编辑 | EditOutlined |
| 清除 | CloseCircleFilled(input 清除按钮) |
| 展开/收起 | RightOutlined / DownOutlined |
| 上传 | UploadOutlined |
| 下载 | DownloadOutlined |
| 设置 | SettingOutlined / SettingTwoTone |
| 用户 | UserOutlined |
| 眼睛(显示/隐藏) | EyeOutlined / EyeInvisibleOutlined |