Files

208 lines
6.7 KiB
Markdown
Raw Permalink 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.
# Carousel 自定义样式指南
Carousel 的视觉表现通过 `ControlTheme` + Design Token 系统控制。以下介绍几种常见的自定义方式。
---
## 1. 使用属性直接控制
最简单的方式是通过 Carousel 的公共属性来控制行为和外观:
```xml
<!-- 基本走马灯 -->
<atom:Carousel Height="160" Background="#364d79">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
<atom:CarouselPage>3</atom:CarouselPage>
<atom:CarouselPage>4</atom:CarouselPage>
</atom:Carousel>
<!-- 自动播放 -->
<atom:Carousel IsAutoPlay="True" AutoPlaySpeed="0:0:5" Height="160">
<atom:CarouselPage>Slide 1</atom:CarouselPage>
<atom:CarouselPage>Slide 2</atom:CarouselPage>
</atom:Carousel>
<!-- 淡入淡出效果 -->
<atom:Carousel TransitionEffect="Fade" Height="160">
<atom:CarouselPage Background="#B3001B">1</atom:CarouselPage>
<atom:CarouselPage Background="#255C99">2</atom:CarouselPage>
</atom:Carousel>
<!-- 显示导航箭头 -->
<atom:Carousel IsShowNavButtons="True" Height="160">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
</atom:Carousel>
<!-- 分页位置在左侧 -->
<atom:Carousel PaginationPosition="Left" Height="160">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
</atom:Carousel>
<!-- 进度指示 + 自动播放 -->
<atom:Carousel IsAutoPlay="True" IsShowTransitionProgress="True" Height="160">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
</atom:Carousel>
```
> 📖 完整示例参考:`controlgallery/AtomUIGallery/ShowCases/Views/DataDisplay/CarouselShowCase.axaml`
---
## 2. 通过 Style 覆盖样式
可以在 AXAML 中使用 `Style` 对 Carousel 及其子控件进行统一样式定制:
### 统一背景和文字
```xml
<Window.Styles>
<Style Selector="atom|Carousel">
<Setter Property="Background" Value="#364d79" />
<Setter Property="Foreground" Value="#fff" />
<Setter Property="Height" Value="160" />
</Style>
<Style Selector="atom|CarouselPage">
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="FontWeight" Value="Bold" />
</Style>
</Window.Styles>
```
### 自定义导航箭头样式
```xml
<!-- 增大导航箭头图标,并调整不透明度 -->
<Style Selector="atom|Carousel /template/ atom|CarouselNavButton">
<Setter Property="IconWidth" Value="24" />
<Setter Property="IconHeight" Value="24" />
<Setter Property="Opacity" Value="0.5" />
</Style>
<Style Selector="atom|Carousel /template/ atom|CarouselNavButton:pointerover">
<Setter Property="Opacity" Value="1.0" />
</Style>
```
### 自定义指示点颜色
```xml
<!-- 使用蓝色指示点 -->
<Style Selector="atom|CarouselPageIndicator">
<Setter Property="Background" Value="#1677ff" />
</Style>
```
### 按分页位置定制
```xml
<!-- 纵向模式下增加导航按钮边距 -->
<Style Selector="atom|Carousel[PaginationPosition=Left]">
<Setter Property="Padding" Value="30 0 0 0" />
</Style>
```
---
## 3. 通过 ControlTheme 完全替换主题
如果需要彻底替换 Carousel 的模板,可以定义自定义 `ControlTheme`:
```xml
<ControlTheme x:Key="MyCustomCarousel" TargetType="atom:Carousel">
<Setter Property="Template">
<ControlTemplate>
<Panel>
<atom:ScrollViewer Name="PART_ScrollViewer"
Background="{TemplateBinding Background}"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden">
<ItemsPresenter Name="PART_ItemsPresenter"
ItemsPanel="{TemplateBinding ItemsPanel}" />
</atom:ScrollViewer>
<!-- 自定义分页指示器或导航按钮 -->
</Panel>
</ControlTemplate>
</Setter>
</ControlTheme>
```
> ⚠️ 注意:完全替换 ControlTheme 将丢失内置的分页指示器、导航按钮、进度动画等功能。建议优先使用 Style 覆盖。
---
## 4. 控制动画行为
```xml
<!-- 禁用过渡动画(页面切换无动画) -->
<atom:Carousel IsMotionEnabled="False" Height="160">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
</atom:Carousel>
<!-- 自定义过渡时长和缓动 -->
<atom:Carousel PageTransitionDuration="0:0:1"
PageInEasing="QuadraticEaseInOut"
PageOutEasing="QuadraticEaseInOut"
Height="160">
<atom:CarouselPage>1</atom:CarouselPage>
<atom:CarouselPage>2</atom:CarouselPage>
</atom:Carousel>
```
---
## 样式选择器速查
> 说明:Avalonia 样式选择器中使用 `atom|Carousel` 语法引用 `atom` XML 命名空间下的类型。
### 按属性选择
| 选择器 | 说明 |
|---|---|
| `atom\|Carousel` | 匹配所有 Carousel 实例 |
| `atom\|Carousel[IsAutoPlay=True]` | 匹配自动播放的走马灯 |
| `atom\|Carousel[IsShowNavButtons=True]` | 匹配显示导航箭头的走马灯 |
| `atom\|Carousel[TransitionEffect=Fade]` | 匹配淡入淡出效果的走马灯 |
### 按分页位置选择
| 选择器 | 说明 |
|---|---|
| `atom\|Carousel[PaginationPosition=Top]` | 分页在顶部 |
| `atom\|Carousel[PaginationPosition=Bottom]` | 分页在底部(默认) |
| `atom\|Carousel[PaginationPosition=Left]` | 分页在左侧 |
| `atom\|Carousel[PaginationPosition=Right]` | 分页在右侧 |
### 按伪类选择
| 选择器 | 说明 |
|---|---|
| `atom\|Carousel:pointerover` | 鼠标悬浮 |
| `atom\|Carousel:disabled` | 禁用状态 |
### 子控件选择器
| 选择器 | 说明 |
|---|---|
| `atom\|CarouselPage` | 匹配所有页面容器 |
| `atom\|CarouselNavButton` | 匹配所有导航箭头按钮 |
| `atom\|CarouselNavButton:pointerover` | 悬浮态导航按钮(不透明度 1.0) |
| `atom\|CarouselPageIndicator` | 匹配所有分页指示点 |
| `atom\|CarouselPageIndicator[IsSelected=True]` | 选中态指示点(宽度扩展) |
| `atom\|CarouselPageIndicator:pointerover` | 悬浮态指示点(不透明度 0.75) |
### 模板内部部件选择器
| 选择器 | 说明 |
|---|---|
| `atom\|Carousel /template/ atom\|CarouselNavButton#PART_PreviousButton` | 前一页按钮 |
| `atom\|Carousel /template/ atom\|CarouselNavButton#PART_NextButton` | 下一页按钮 |
| `atom\|Carousel /template/ LayoutTransformControl#PaginationLayoutTransform` | 分页指示器布局容器 |
| `atom\|CarouselPageIndicator /template/ Border#PART_Frame` | 指示点主框架 |
| `atom\|CarouselPageIndicator /template/ Border#Progress` | 指示点进度条 |