Files

8.0 KiB
Raw Permalink Blame History

SplitButton Design Token

SplitButton 复用 ButtonToken(Token ID: "Button")作为组件级 Design Token 作用域。SplitButton 在构造函数中通过 this.RegisterTokenResourceScope(ButtonToken.ScopeProvider) 注册到 Button 的 Token 作用域,因此内部的两个按钮(PrimaryButton 和 SecondaryButton)均为 AtomUI Button 实例,所有按钮相关的颜色、间距、字体 Token 均与 Button 共享。


Token 资源访问方式

在 AXAML 中使用组件级 Token(来自 ButtonToken):

{atom:ButtonTokenResource PrimaryColor}
{atom:ButtonTokenResource DefaultBg}
{atom:ButtonTokenResource Padding}

在 AXAML 中使用全局共享 Token:

{atom:SharedTokenResource ColorPrimary}
{atom:SharedTokenResource ColorBorder}
{atom:SharedTokenResource ControlHeight}

SplitButton 使用的关键 Token

SplitButton 主要消费 ButtonToken 和 SharedToken 两个层级的 Token。

来自 ButtonToken(组件级)

由于 SplitButton 注册了 ButtonToken.ScopeProvider,内部的两个 Button 可以访问完整的 Button 组件级 Token。以下列出 SplitButton 场景下最常用的 Token(完整列表请参见 ButtonToken.md):

颜色 Token

Token 名 类型 来源 说明
PrimaryColor Color SharedToken.ColorTextLightSolid Primary 类型按钮文本颜色(通常为白色)
DefaultColor Color SharedToken.ColorText Default 类型按钮文本颜色
DefaultBg Color SharedToken.ColorBgContainer Default 类型按钮背景色
DefaultBorderColor Color SharedToken.ColorBorder Default 类型按钮边框颜色
DangerColor Color SharedToken.ColorTextLightSolid 危险按钮文本颜色
BorderColorDisabled Color SharedToken.ColorBorder 禁用态边框颜色

悬浮/激活态颜色 Token

Token 名 类型 来源 说明
DefaultHoverBg Color SharedToken.ColorBgContainer Default 按钮悬浮背景色
DefaultHoverColor Color SharedToken.ColorPrimaryHover Default 按钮悬浮文本颜色
DefaultHoverBorderColor Color SharedToken.ColorPrimaryHover Default 按钮悬浮边框颜色
DefaultActiveBg Color SharedToken.ColorBgContainer Default 按钮激活背景色
DefaultActiveColor Color SharedToken.ColorPrimaryActive Default 按钮激活文本颜色
DefaultActiveBorderColor Color SharedToken.ColorPrimaryActive Default 按钮激活边框颜色

阴影 Token

Token 名 类型 来源 说明
DefaultShadow BoxShadows 基于 SharedToken.ColorControlOutline Default 按钮底部微阴影
PrimaryShadow BoxShadows 基于 SharedToken.ColorControlOutline Primary 按钮底部微阴影
DangerShadow BoxShadows 基于 SharedToken.ColorErrorOutline 危险按钮底部微阴影

内间距 Token

Token 名 类型 来源 说明
Padding Thickness 基于 SharedToken.PaddingContentHorizontal、SharedToken.ControlHeight 中号按钮内间距
PaddingLG Thickness 基于 SharedToken.PaddingContentHorizontal、SharedToken.ControlHeightLG 大号按钮内间距
PaddingSM Thickness 基于 SharedToken.ControlHeightSM 小号按钮内间距

图标 Token

Token 名 类型 来源 说明
IconSize double SharedToken.IconSize 中号按钮图标尺寸
IconSizeLG double SharedToken.IconSize 大号按钮图标尺寸
IconSizeSM double SharedToken.IconSizeSM 小号按钮图标尺寸
IconMargin Thickness SharedToken.UniformlyPaddingXXS 图标与文本之间的间距
OnlyIconSize double SharedToken.IconSizeLG 仅图标中号按钮图标尺寸(SecondaryButton 使用)
OnlyIconSizeLG double SharedToken.IconSizeLG 仅图标大号按钮图标尺寸
OnlyIconSizeSM double SharedToken.IconSize 仅图标小号按钮图标尺寸

字体 Token

Token 名 类型 来源 说明
ContentFontSize double SharedToken.FontSize 中号按钮字体大小
ContentFontSizeLG double SharedToken.FontSizeLG 大号按钮字体大小
ContentFontSizeSM double SharedToken.FontSize 小号按钮字体大小
ContentLineHeight double 基于 ContentFontSize 计算 中号按钮行高
ContentLineHeightLG double 基于 ContentFontSizeLG 计算 大号按钮行高
ContentLineHeightSM double 基于 ContentFontSizeSM 计算 小号按钮行高

其他 Token

Token 名 类型 来源 说明
GutterToFlyout double SharedToken.UniformlyMarginXXS 下拉菜单与按钮之间的间距

来自 SharedToken(在 SplitButton 主题中直接引用)

除组件级 Token 外,SplitButton 的 ControlTheme 还直接引用了以下全局 SharedToken:

Token 资源键 使用场景
ColorBorder SplitButton 的 BorderBrush 和 SplitSeparatorBrush(分隔线颜色)
BorderThickness SplitButton 的 BorderThickness(边框粗细)
BorderRadius 中号 SplitButton 的 CornerRadius
BorderRadiusSM 小号 SplitButton 的 CornerRadius
BorderRadiusLG 大号 SplitButton 的 CornerRadius
EnableMotion 全局动画开关,控制 IsMotionEnabled 默认值
EnableWaveSpirit 全局波纹开关,控制 IsWaveSpiritEnabled 默认值
ControlHeight / ControlHeightSM / ControlHeightLG 内部 Button 高度(中/小/大)
ColorPrimary / ColorPrimaryHover / ColorPrimaryActive Primary 按钮主色调及其交互态
ColorError / ColorErrorHover / ColorErrorActive 错误/危险色系
ColorText / ColorTextDisabled 文本色系
ColorBgContainer / ColorBgContainerDisabled 容器背景色系

分隔线渲染

SplitButton 在 IsPrimaryButtonType=True 时,通过 Render 方法使用 SplitSeparatorBrush 绘制两个按钮之间的分隔线背景。该画刷默认绑定到 SharedToken.ColorBorder,确保分隔线颜色跟随主题变化。

在 Default 模式下(IsPrimaryButtonType=False),两个按钮的边框在 ArrangeOverride 中重叠,自然形成分隔线效果,无需额外绘制。


Token 对外观的具体影响

按钮类型与 Token 映射

SplitButton 内部的两个 Button 消费与独立 Button 完全相同的 Token。通过 EffectiveButtonType 属性(由 IsPrimaryButtonType 驱动),内部 Button 使用 Default 或 Primary 样式:

按钮类型 正常态 悬浮态 按下态 禁用态
Default DefaultColor / DefaultBg / DefaultBorderColor DefaultHoverColor / DefaultHoverBorderColor DefaultActiveColor / DefaultActiveBorderColor ColorTextDisabled / ColorBgContainerDisabled
Primary PrimaryColor / ColorPrimary - / ColorPrimaryHover - / ColorPrimaryActive ColorTextDisabled / ColorBgContainerDisabled

危险态下的 Token 覆盖

当 IsDanger=True 时,上述色系会被替换为 Error 色系(ColorError / ColorErrorHover / ColorErrorActive),阴影替换为 DangerShadow。

尺寸与 Token 映射

SplitButton 的尺寸由 SizeType 控制。圆角由 SplitButton 自身的 ControlTheme 设置(然后分配给左右内部 Button),按钮内部的高度/间距/字号通过内部 Button 消费 ButtonToken:

尺寸 外部圆角 内部按钮高度 内部按钮间距 内部按钮字号 内部按钮图标
Large BorderRadiusLG ControlHeightLG PaddingLG ContentFontSizeLG IconSizeLG
Middle BorderRadius ControlHeight Padding ContentFontSize IconSize
Small BorderRadiusSM ControlHeightSM PaddingSM ContentFontSizeSM IconSizeSM