# ProgressBar 自定义样式指南
ProgressBar 家族(ProgressBar、CircleProgress、DashboardProgress、StepsProgressBar)的视觉表现通过自定义渲染 + Design Token 系统控制。由于进度条采用 `DrawingContext` 直接绘制,样式自定义主要通过属性控制和 Token 覆盖实现。
---
## 1. 使用属性直接控制
### 线形进度条(ProgressBar)
```xml
```
### 圆形进度条(CircleProgress)
```xml
```
### 仪表盘进度条(DashboardProgress)
```xml
```
### 步骤进度条(StepsProgressBar)
```xml
```
> 📖 完整示例参考:`controlgallery/AtomUIGallery/ShowCases/Views/Feedback/ProgressBarShowCase.axaml`
---
## 2. 自定义颜色
### 自定义描边颜色
```xml
```
### 自定义轨道颜色
```xml
```
### 每个步骤独立颜色
```xml
```
```csharp
// ViewModel
public List StepsChunkBrushes { get; } = new()
{
new SolidColorBrush(Colors.Green),
new SolidColorBrush(Colors.Green),
new SolidColorBrush(Colors.Orange),
new SolidColorBrush(Colors.Red),
new SolidColorBrush(Colors.Red),
};
```
---
## 3. 成功阈值
```xml
```
---
## 4. 百分比标签位置(ProgressBar)
ProgressBar 支持通过 `PercentPosition` 精确控制百分比标签位置:
```csharp
// ViewModel 中定义不同位置
public PercentPosition InnerStartPercentPosition { get; } = new() { IsInner = true, Alignment = LinePercentAlignment.Start };
public PercentPosition InnerCenterPercentPosition { get; } = new() { IsInner = true, Alignment = LinePercentAlignment.Center };
public PercentPosition InnerEndPercentPosition { get; } = new() { IsInner = true, Alignment = LinePercentAlignment.End };
public PercentPosition OuterStartPercentPosition { get; } = new() { IsInner = false, Alignment = LinePercentAlignment.Start };
public PercentPosition OuterCenterPercentPosition { get; } = new() { IsInner = false, Alignment = LinePercentAlignment.Center };
```
```xml
```
> 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/Feedback/ProgressBarShowCase.axaml` 中 "Change progress value position" 示例。
---
## 5. 通过 Style 覆盖样式
```xml
```
---
## 6. 动态交互示例
```xml
Sub
Add
```
```csharp
public class ProgressBarViewModel : ReactiveObject
{
[Reactive] public double ProgressValue { get; set; } = 50;
public ReactiveCommand AddProgressValue { get; }
public ReactiveCommand SubProgressValue { get; }
public ProgressBarViewModel()
{
AddProgressValue = ReactiveCommand.Create(() =>
{
ProgressValue = Math.Min(100, ProgressValue + 10);
});
SubProgressValue = ReactiveCommand.Create(() =>
{
ProgressValue = Math.Max(0, ProgressValue - 10);
});
}
}
```
> 📖 参考:`controlgallery/AtomUIGallery/ShowCases/Views/Feedback/ProgressBarShowCase.axaml` 中 "Dynamic" 示例。
---
## 样式选择器速查
### 按控件类型选择
| 选择器 | 说明 |
|---|---|
| `atom\|ProgressBar` | 匹配所有线形进度条 |
| `atom\|CircleProgress` | 匹配所有圆形进度条 |
| `atom\|DashboardProgress` | 匹配所有仪表盘进度条 |
| `atom\|StepsProgressBar` | 匹配所有步骤进度条 |
### 按状态选择
| 选择器 | 说明 |
|---|---|
| `atom\|ProgressBar[Status=Normal]` | Normal 状态的线形进度条 |
| `atom\|ProgressBar[Status=Exception]` | 异常状态的线形进度条 |
| `atom\|ProgressBar[Status=Active]` | 活跃状态的线形进度条 |
| `atom\|CircleProgress[Status=Exception]` | 异常状态的圆形进度条 |
### 按尺寸选择
| 选择器 | 说明 |
|---|---|
| `atom\|ProgressBar[SizeType=Large]` | 大号线形进度条 |
| `atom\|ProgressBar[SizeType=Small]` | 小号线形进度条 |
| `atom\|CircleProgress[SizeType=Middle]` | 中号圆形进度条 |
### 按伪类选择
| 选择器 | 说明 |
|---|---|
| `atom\|ProgressBar:completed` | 已完成的进度条(Value == Maximum) |
| `atom\|ProgressBar:indeterminate` | 不定态进度条 |
| `atom\|ProgressBar:horizontal` | 水平方向进度条 |
| `atom\|ProgressBar:vertical` | 垂直方向进度条 |
| `atom\|ProgressBar:labelinner` | 百分比标签在内部的进度条 |
| `atom\|ProgressBar:disabled` | 禁用状态 |
### 组合选择器示例
| 选择器 | 说明 |
|---|---|
| `atom\|ProgressBar[Status=Exception]:completed` | 异常但已完成的进度条 |
| `atom\|ProgressBar:vertical[SizeType=Small]` | 垂直方向小号进度条 |
| `atom\|StepsProgressBar:horizontal[SizeType=Large]` | 水平方向大号步骤进度条 |