# Message Design Token Message 控件使用 `MessageToken`(Token ID: `"Message"`)作为组件级 Design Token。所有视觉属性均从全局 `SharedToken` 派生,不使用硬编码值。 > 📖 Token 源码位置:`src/AtomUI.Desktop.Controls/Message/MessageToken.cs` --- ## Token 资源访问方式 ### AXAML 中访问 ```xml {atom:MessageTokenResource ContentBg} {atom:MessageTokenResource ContentPadding} {atom:MessageTokenResource MessageIconSize} {atom:MessageTokenResource MessageIconMargin} {atom:MessageTokenResource MessageTopMargin} {atom:SharedTokenResource ColorPrimary} {atom:SharedTokenResource ColorSuccess} {atom:SharedTokenResource ColorWarning} {atom:SharedTokenResource ColorError} ``` --- ## Token 类定义 ```csharp [ControlDesignToken] internal class MessageToken : AbstractControlDesignToken { public const string ID = "Message"; public static readonly ControlTokenResourceScopeProvider ScopeProvider = new(ID); // ... } ``` --- ## 完整 Token 属性列表 ### 背景与容器 | Token 属性 | 类型 | 派生自 SharedToken | 说明 | |---|---|---|---| | `ContentBg` | `Color` | `ColorBgElevated` | 消息卡片背景色 | | `ContentPadding` | `Thickness` | `ControlHeightLG`、`FontSize`、`RelativeLineHeight`、`UniformlyPaddingXS` | 消息卡片内边距 | > `ContentPadding` 的计算公式:垂直方向 = `(ControlHeightLG - FontSize × RelativeLineHeight) / 2`;水平方向 = `UniformlyPaddingXS`。 ### 图标 | Token 属性 | 类型 | 派生自 SharedToken | 说明 | |---|---|---|---| | `MessageIconSize` | `double` | `FontSizeSM × RelativeLineHeightSM` | 消息图标尺寸 | | `MessageIconMargin` | `Thickness` | `UniformlyMarginXS` | 消息图标右侧外边距(`0, 0, MarginXS, 0`) | ### 间距 | Token 属性 | 类型 | 派生自 SharedToken | 说明 | |---|---|---|---| | `MessageTopMargin` | `Thickness` | `UniformlyMargin` | 消息卡片外边距(上、左、右各 `UniformlyMargin`,下为 0) | --- ## 主题中使用的全局 SharedToken 除组件级 Token 外,MessageCard 的 ControlTheme 还直接引用了以下全局 `SharedToken`: | Token 资源键 | 使用场景 | |---|---| | `EnableMotion` | 全局动画开关,控制消息入场/出场动画 | | `MotionDurationMid` | 入场/出场动画时长 | | `BoxShadows` | 消息卡片阴影效果 | | `BorderRadiusLG` | 消息卡片大圆角 | | `FontSize` | 消息文本字体大小 | | `FontHeight` | 消息文本行高 | | `ColorText` | 消息文本颜色 | | `SelectionBackground` | 文本选中背景色 | | `SelectionForeground` | 文本选中前景色 | | `ColorPrimary` | Information / Loading 消息图标颜色(蓝色) | | `ColorSuccess` | Success 消息图标颜色(绿色) | | `ColorWarning` | Warning 消息图标颜色(黄色) | | `ColorError` | Error 消息图标颜色(红色) | --- ## Token 在主题中的使用示例 ### MessageCardTheme.axaml 中的 Token 引用 ```xml ``` ### WindowMessageManagerTheme.axaml 中的 Token 引用 ```xml ``` --- ## Token 对外观的具体影响 ### 消息类型与颜色 Token 映射 | 消息类型 | 图标颜色 Token | 默认颜色 | |---|---|---| | `Information` | `SharedToken.ColorPrimary` | 蓝色(`#1677ff`) | | `Success` | `SharedToken.ColorSuccess` | 绿色(`#52c41a`) | | `Warning` | `SharedToken.ColorWarning` | 黄色(`#faad14`) | | `Error` | `SharedToken.ColorError` | 红色(`#ff4d4f`) | | `Loading` | `SharedToken.ColorPrimary` | 蓝色(`#1677ff`) | ### 视觉布局 Token 映射 | 视觉属性 | Token | 说明 | |---|---|---| | 卡片背景 | `ContentBg` ← `ColorBgElevated` | 浮层背景色,浅色模式下为白色 | | 卡片阴影 | `SharedToken.BoxShadows` | 全局标准阴影 | | 卡片圆角 | `SharedToken.BorderRadiusLG` | 大号圆角(8px) | | 卡片内边距 | `ContentPadding` | 垂直方向根据控件高度和字号自适应 | | 卡片外边距 | `MessageTopMargin` ← `UniformlyMargin` | 消息之间的堆叠间距 | | 图标尺寸 | `MessageIconSize` ← `FontSizeSM × RelativeLineHeightSM` | 与小号字体行高对齐 | | 图标间距 | `MessageIconMargin` ← `UniformlyMarginXS` | 图标与文本的间隔 | | 文本字号 | `SharedToken.FontSize` | 全局默认字号(14px) | | 文本行高 | `SharedToken.FontHeight` | 全局默认行高 | | 文本颜色 | `SharedToken.ColorText` | 全局文本颜色 | | 动画时长 | `SharedToken.MotionDurationMid` | 中等动画时长 | --- ## Token 派生链总结 ``` SharedToken (DesignToken) ├── ColorBgElevated → ContentBg(卡片背景色) ├── ControlHeightLG → ContentPadding(垂直内边距计算) ├── FontSize → ContentPadding(垂直内边距计算) ├── RelativeLineHeight → ContentPadding(垂直内边距计算) ├── UniformlyPaddingXS → ContentPadding(水平内边距) ├── FontSizeSM → MessageIconSize(图标尺寸) ├── RelativeLineHeightSM → MessageIconSize(图标尺寸) ├── UniformlyMarginXS → MessageIconMargin(图标右侧间距) ├── UniformlyMargin → MessageTopMargin(卡片外边距) ├── BoxShadows → 卡片阴影(直接引用) ├── BorderRadiusLG → 卡片圆角(直接引用) ├── FontHeight → 文本行高(直接引用) ├── ColorText → 文本颜色(直接引用) ├── ColorPrimary → Information / Loading 图标颜色 ├── ColorSuccess → Success 图标颜色 ├── ColorWarning → Warning 图标颜色 ├── ColorError → Error 图标颜色 ├── MotionDurationMid → 入场/出场动画时长 └── EnableMotion → 动画开关 ```