# Button 使用文档
本文档介绍 AtomUI Button 控件的各种使用方式,示例代码摘自 Gallery 演示程序。
> 📖 Gallery 源码位置:`controlgallery/AtomUIGallery/ShowCases/Views/General/ButtonShowCase.axaml`
---
## 前置准备
在 AXAML 中使用 Button,需要引入以下命名空间:
```xml
xmlns:atom="https://atomui.net"
xmlns:antdicons="https://atomui.net/icons/antdesign"
```
在 C# 代码中引入:
```csharp
using AtomUI.Desktop.Controls; // Button 控件
using AtomUI.Controls; // SizeType 等共享类型
```
---
## 1. 按钮类型
AtomUI 提供五种按钮类型,通过 `ButtonType` 属性设置。不设置时默认为 `Default`。
```xml
Primary Button
Default Button
Dashed
Text Button
Link Button
```
**使用场景指引**:
- 一个操作区域只放一个 **Primary** 按钮,引导用户注意力
- 多个并列操作使用 **Default** 按钮
- 添加类操作使用 **Dashed** 按钮
- 内联次级操作使用 **Text** 按钮
- 导航跳转使用 **Link** 按钮
---
## 2. 按钮形状
通过 `Shape` 属性设置按钮形状,支持默认矩形、圆形和胶囊形。
```xml
Primary
Default
Primary
Default
AA
AA
```
**提示**:圆形按钮会强制 `宽度 = 高度`,最适合只放一个图标的场景。
---
## 3. 按钮尺寸
通过 `SizeType` 属性设置尺寸,支持 `Large`、`Middle`(默认)、`Small` 三种。
```xml
Large
Default
Small
```
尺寸也支持数据绑定,可在运行时动态切换:
```xml
Primary
Dashed
Default
Link
```
```csharp
// ViewModel
public class ButtonViewModel : ReactiveObject
{
private SizeType _buttonSizeType;
public SizeType ButtonSizeType
{
get => _buttonSizeType;
set => this.RaiseAndSetIfChanged(ref _buttonSizeType, value);
}
}
```
尺寸与形状和图标组合使用:
```xml
Download
```
---
## 4. 图标按钮
通过 `Icon` 属性设置按钮图标,图标使用 Ant Design 图标集提供:
```xml
Search
Search
Search
Search
```
**图标 + 危险样式组合**:
```xml
Search
Search
```
---
## 5. 加载中状态
通过设置 `IsLoading` 属性控制按钮加载状态。加载中时按钮显示旋转图标,不透明度降低。
### 静态加载状态
```xml
Loading
Loading
```
### 点击后动态进入加载态
这是最常见的使用场景——点击按钮发起异步请求,完成后恢复:
```xml
Click me!
Click me!
```
```csharp
// Code-behind
public void HandleLoadingBtnClick(object? sender, RoutedEventArgs args)
{
if (sender is Button button)
{
button.IsLoading = true;
Dispatcher.UIThread.InvokeAsync(async () =>
{
await Task.Delay(TimeSpan.FromSeconds(3)); // 模拟异步操作
button.IsLoading = false;
});
}
}
```
---
## 6. 危险按钮
通过 `IsDanger="True"` 标记危险操作,所有按钮类型均支持:
```xml
Primary
Default
Dashed
Text
Link
```
**使用场景**:删除、移动、修改权限等不可逆操作,通常需配合二次确认弹窗。
---
## 7. 幽灵按钮
通过 `IsGhost="True"` 使按钮背景透明,适合放置在有色背景上:
```xml
Primary
Default
Dashed
Text
Link
Danger
Primary
Default
Danger
```
---
## 8. Block 按钮
Ant Design 的 `block` 属性在 AtomUI 中通过 Avalonia 原生布局属性 `HorizontalAlignment="Stretch"` 实现,使按钮撑满父容器宽度:
```xml
Primary
Default
Dashed
Text
Link
```
---
## 9. 禁用状态
通过 `IsEnabled="False"` 禁用按钮,所有类型均支持:
```xml
Primary
Primary(disabled)
Default
Default(disabled)
Danger Primary
Danger Primary(disabled)
Ghost
Ghost(disabled)
```
---
## 10. MVVM 命令绑定
Button 继承自 Avalonia 的 `Button`,完整支持 `Command` / `CommandParameter` 绑定模式:
```xml
Save
Delete
```
```csharp
// ViewModel(使用 ReactiveUI)
[Reactive]
public ReactiveCommand SaveCommand { get; }
public MyViewModel()
{
var canSave = this.WhenAnyValue(x => x.IsValid);
SaveCommand = ReactiveCommand.CreateFromTask(
async () => { await _repository.SaveAsync(); },
canSave);
}
```
当 `CanExecute` 返回 `false` 时,按钮会**自动禁用**(灰色调 + 不可点击),无需手动管理 `IsEnabled`。
---
## 11. 键盘快捷键
利用继承自 Avalonia Button 的 `HotKey`、`IsDefault`、`IsCancel` 属性:
```xml
OK
Cancel
Save (Ctrl+S)
```
---
## 12. 控制动画行为
```xml
No Animation
No Wave
```
---
## 常见组合模式
### 操作栏(主 + 次按钮)
```xml
Submit
Cancel
```
### 确认/取消对话框
```xml
Cancel
OK
```
### 危险操作确认
```xml
Cancel
Delete
```
### 工具栏(纯图标按钮组)
```xml
```