Files
AtomUI/docs/Desktop.Controls/SplitButton/SplitButtonAPI.md
T

183 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SplitButton API 参考
## 命名空间
```csharp
namespace AtomUI.Desktop.Controls;
```
AXAML 命名空间前缀:`atom`(`xmlns:atom="https://atomui.net"`)
---
## 枚举类型
### SizeType(来自 `AtomUI.Controls`)
尺寸类型枚举。
| 值 | 说明 |
|---|---|
| `Small` | 小号 |
| `Middle` | 中号(默认) |
| `Large` | 大号 |
### FlyoutTriggerType(来自 `AtomUI.Controls`)
弹出菜单触发方式枚举。
| 值 | 说明 |
|---|---|
| `Click` | 点击触发(默认) |
| `Hover` | 鼠标悬浮触发 |
### PlacementMode(来自 `Avalonia.Controls.Primitives.PopupPositioning`)
弹出层位置模式枚举。SplitButton 默认使用 `BottomEdgeAlignedRight`。
| 常用值 | 说明 |
|---|---|
| `Bottom` | 下方居中 |
| `BottomEdgeAlignedLeft` | 下方左对齐 |
| `BottomEdgeAlignedRight` | 下方右对齐(SplitButton 默认值) |
| `Top` | 上方居中 |
| `TopEdgeAlignedLeft` | 上方左对齐 |
| `TopEdgeAlignedRight` | 上方右对齐 |
---
## 公共属性(StyledProperty)
### SplitButton 自身属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Flyout` | `Flyout?` | `null` | 下拉菜单弹出层(支持 `MenuFlyout`),由右侧按钮触发 |
| `TriggerType` | `FlyoutTriggerType` | `Click` | Flyout 触发方式(`Click` / `Hover`) |
| `IsShowArrow` | `bool` | `false` | 弹出菜单是否显示指示箭头 |
| `IsPointAtCenter` | `bool` | `false` | 箭头是否指向触发元素中心 |
| `Placement` | `PlacementMode` | `BottomEdgeAlignedRight` | Flyout 弹出位置 |
| `PlacementAnchor` | `PopupAnchor` | 默认值 | Flyout 弹出锚点 |
| `PlacementGravity` | `PopupGravity` | 默认值 | Flyout 弹出重力方向 |
| `GutterToFlyout` | `double` | 由 Token 控制 | 弹出层与按钮之间的间距 |
| `MouseEnterDelay` | `int` | 默认值 | 悬浮触发延迟(毫秒),仅 `TriggerType=Hover` 时生效 |
| `MouseLeaveDelay` | `int` | 默认值 | 离开关闭延迟(毫秒),仅 `TriggerType=Hover` 时生效 |
| `IsPrimaryButtonType` | `bool` | `false` | 是否使用 Primary 按钮样式(蓝色背景),`false` 时使用 Default 样式(白色背景 + 边框) |
| `IsDanger` | `bool` | `false` | 危险按钮样式,启用后两个内部按钮使用红色系 |
| `Icon` | `PathIcon?` | `null` | 主按钮图标,使用 Ant Design 图标集 |
| `OpenIndicator` | `PathIcon?` | `EllipsisOutlined` | 下拉按钮图标,默认为省略号图标 |
| `SizeType` | `SizeType` | `SizeType.Middle` | 按钮尺寸(共享属性,通过 `AddOwner` 注册) |
| `IsMotionEnabled` | `bool` | 跟随全局 Token | 是否启用过渡动画(共享属性) |
| `IsWaveSpiritEnabled` | `bool` | 跟随全局 Token | 是否启用点击波纹效果(共享属性) |
### ICommandSource 接口属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Command` | `ICommand?` | `null` | 主按钮点击命令,`CanExecute` 为 `false` 时自动禁用整个 SplitButton |
| `CommandParameter` | `object?` | `null` | 命令参数 |
| `HotKey` | `KeyGesture?` | `null` | 键盘快捷键,触发主按钮点击 |
### 继承自 Avalonia.Controls.ContentControl 的常用属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| `Content` | `object?` | `null` | 主按钮文本内容 |
| `ContentTemplate` | `IDataTemplate?` | `null` | 内容模板 |
| `HorizontalAlignment` | `HorizontalAlignment` | `Left` | 水平对齐 |
| `VerticalAlignment` | `VerticalAlignment` | `Top` | 垂直对齐 |
| `IsEnabled` | `bool` | `true` | 是否启用(同时受 `Command.CanExecute` 控制) |
| `Foreground` | `IBrush?` | 由主题控制 | 前景色 |
| `Background` | `IBrush?` | 由主题控制 | 背景色 |
| `BorderBrush` | `IBrush?` | 由 Token 控制 | 边框颜色(`SharedToken.ColorBorder`) |
| `BorderThickness` | `Thickness` | 由 Token 控制 | 边框粗细(`SharedToken.BorderThickness`) |
| `CornerRadius` | `CornerRadius` | 由 Token 控制 | 圆角半径(根据 `SizeType` 自动设置) |
---
## 事件
| 事件名 | 类型 | 说明 |
|---|---|---|
| `Click` | `EventHandler<RoutedEventArgs>` | 主按钮(左侧)被点击时触发,路由策略为 `Bubble` |
> **重要提示**:`Click` 事件仅在点击左侧主按钮时触发。点击右侧下拉按钮会打开 Flyout,不会触发 `Click` 事件。内部主按钮的 `Click` 事件会被标记为 `Handled`,防止冒泡到外部。
---
## 伪类(Pseudo-Classes)
SplitButton 支持以下伪类,可在样式选择器中使用:
| 伪类 | 触发条件 |
|---|---|
| `:flyout-open` | Flyout 处于打开状态 |
| `:pressed` | 主按钮被按下(键盘 Space/Enter 触发) |
| `:checked` | 选中状态(用于 `ToggleSplitButton` 派生类) |
| `:disabled` | `IsEnabled == false` 或 `Command.CanExecute == false` |
| `:pointerover` | 鼠标悬浮在控件上 |
| `:focus` | 获得焦点 |
| `:focus-visible` | 通过键盘(Tab 键)获得焦点 |
---
## 实现的接口
### ICommandSource
```csharp
public ICommand? Command { get; set; }
public object? CommandParameter { get; set; }
```
支持 MVVM 命令绑定。当 `Command.CanExecute` 返回 `false` 时,SplitButton 自动禁用(灰色调 + 不可点击)。
### ISizeTypeAware
```csharp
public SizeType SizeType { get; set; }
```
支持 Large / Middle / Small 三种尺寸,两个内部 Button 同步尺寸。
### IWaveSpiritAwareControl
```csharp
public bool IsWaveSpiritEnabled { get; set; }
```
控制内部 Button 的点击波纹效果开关。
### ICompactSpaceAware
在 `Space.Compact` 容器中使用时自动调整圆角。SplitButton 提供以下行为:
- 根据在紧凑空间中的位置自动裁剪外部圆角
- 将裁剪后的圆角重新分配给左右两个内部 Button
- 返回边框厚度供容器计算相邻控件间距
---
## 键盘交互
| 按键 | 行为 |
|---|---|
| `Space` / `Enter` | 触发主按钮点击(`Click` 事件 + `Command` 执行) |
| `Alt+Down` | 打开 Flyout(需非 XY 导航模式) |
| `F4` | 打开 Flyout |
| `Escape` | 关闭 Flyout(当 Flyout 无可聚焦内容时) |
---
## 内部属性(Internal)
以下属性为内部使用,不作为公共 API:
| 属性名 | 类型 | 说明 |
|---|---|---|
| `SplitSeparatorBrush` | `IBrush?` | Primary 模式下分隔线画刷 |
| `EffectiveButtonType` | `ButtonType` | 内部 Button 的实际类型(由 `IsPrimaryButtonType` 驱动) |
| `CompactSpaceItemPosition` | `SpaceItemPosition?` | 紧凑空间中的位置 |
| `CompactSpaceOrientation` | `Orientation` | 紧凑空间方向 |
| `IsUsedInCompactSpace` | `bool` | 是否处于紧凑空间中 |