mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-19 15:20:25 +08:00
7.0 KiB
7.0 KiB
Window 自定义样式指南
Window 的视觉表现通过 ControlTheme + Design Token 系统控制。以下介绍几种常见的自定义方式。
1. 使用属性直接控制
最简单的方式是通过 Window 的公共属性来控制外观:
<!-- 基本窗口 -->
<atom:Window Title="我的应用"
WindowStartupLocation="CenterScreen"
Width="1200" Height="800">
<!-- 内容 -->
</atom:Window>
<!-- 带 Logo 的窗口 -->
<atom:Window Title="我的应用">
<atom:Window.Logo>
<Image Source="/Assets/app-logo.png" />
</atom:Window.Logo>
<!-- 内容 -->
</atom:Window>
<!-- 隐藏标题栏 -->
<atom:Window IsTitleBarVisible="False">
<!-- 无标题栏的自定义窗口 -->
</atom:Window>
<!-- 配置标题按钮 -->
<atom:Window IsPinCaptionButtonEnabled="True"
IsFullScreenCaptionButtonEnabled="True">
<!-- 显示置顶和全屏按钮 -->
</atom:Window>
<!-- 限制窗口最大尺寸为屏幕的 80% -->
<atom:Window MaxWidthScreenRatio="0.8"
MaxHeightScreenRatio="0.8">
<!-- 内容 -->
</atom:Window>
📖 Gallery 主窗口使用范例:
controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml
2. 通过 Style 覆盖样式
可以在 AXAML 中使用 Style 对 Window 进行全局或局部样式覆盖:
自定义窗口背景色
<atom:Window.Styles>
<Style Selector="atom|Window">
<Setter Property="Background" Value="#1a1a2e" />
<Setter Property="Foreground" Value="#e0e0e0" />
</Style>
</atom:Window.Styles>
自定义内容区域背景
<atom:Window ContentFrameBackground="#f5f5f5">
<!-- 内容区域使用浅灰色背景 -->
</atom:Window>
自定义标题栏背景
<atom:Window TitleBarFrameBackground="LightBlue">
<!-- 标题栏使用蓝色背景 -->
</atom:Window>
平台差异化样式
<atom:Window.Styles>
<!-- 仅在 Linux 下添加额外内间距 -->
<Style Selector="atom|Window[OsType=Linux]">
<Setter Property="Padding" Value="4" />
</Style>
<!-- 仅在 macOS 下调整标题字号 -->
<Style Selector="atom|Window[OsType=macOS]">
<Setter Property="TitleFontSize" Value="14" />
</Style>
</atom:Window.Styles>
3. 使用框架层实现高级视觉效果
窗口级渐变背景
<atom:Window>
<atom:Window.WindowFrameLayer>
<Border>
<Border.Background>
<LinearGradientBrush StartPoint="0%,0%" EndPoint="100%,100%">
<GradientStop Color="#667eea" Offset="0" />
<GradientStop Color="#764ba2" Offset="1" />
</LinearGradientBrush>
</Border.Background>
</Border>
</atom:Window.WindowFrameLayer>
<!-- 内容 -->
</atom:Window>
带不透明度的内容区背景图
<atom:Window ContentFrameLayerOpacity="0.3">
<atom:Window.ContentFrameLayer>
<Image Source="/Assets/bg-pattern.png" Stretch="UniformToFill" />
</atom:Window.ContentFrameLayer>
<!-- 内容 -->
</atom:Window>
使用模板定义框架层内容
<atom:Window>
<atom:Window.WindowFrameLayerTemplate>
<DataTemplate>
<Border>
<Border.Background>
<RadialGradientBrush>
<GradientStop Color="#1677ff" Offset="0" />
<GradientStop Color="Transparent" Offset="1" />
</RadialGradientBrush>
</Border.Background>
</Border>
</DataTemplate>
</atom:Window.WindowFrameLayerTemplate>
<!-- 内容 -->
</atom:Window>
4. 通过 ControlTheme 完全替换主题
如果需要彻底替换 Window 的模板和样式,可以定义自定义 ControlTheme:
<ControlTheme x:Key="MyCustomWindow" TargetType="atom:Window">
<Setter Property="Template">
<ControlTemplate TargetType="atom:Window">
<Border Background="{TemplateBinding Background}"
CornerRadius="{TemplateBinding CornerRadius}">
<DockPanel>
<!-- 自定义标题栏区域 -->
<ContentPresenter DockPanel.Dock="Top"
Content="{TemplateBinding TitleBar}" />
<!-- 内容区域 -->
<ContentPresenter Content="{TemplateBinding Content}" />
</DockPanel>
</Border>
</ControlTemplate>
</Setter>
</ControlTheme>
<!-- 使用 -->
<atom:Window Theme="{StaticResource MyCustomWindow}">
<!-- 内容 -->
</atom:Window>
⚠️ 注意:完全替换 ControlTheme 将丢失内置的媒体查询、对话框层管理、窗口缩放器等功能。建议优先使用 Style 覆盖和框架层实现自定义效果。
样式选择器速查
说明:Avalonia 样式选择器中使用
atom|Window语法引用atomXML 命名空间下的Window类型,其中|是命名空间分隔符。
按控件类型选择
| 选择器 | 说明 |
|---|---|
atom|Window |
匹配所有 AtomUI Window 实例 |
atom|WindowTitleBar |
匹配窗口标题栏控件 |
按操作系统选择
| 选择器 | 说明 |
|---|---|
atom|Window[OsType=Windows] |
匹配 Windows 平台的窗口 |
atom|Window[OsType=Linux] |
匹配 Linux 平台的窗口 |
atom|Window[OsType=macOS] |
匹配 macOS 平台的窗口 |
按窗口状态选择
| 选择器 | 说明 |
|---|---|
atom|Window[WindowState=Normal] |
匹配正常状态的窗口 |
atom|Window[WindowState=Maximized] |
匹配最大化状态的窗口 |
atom|Window[WindowState=FullScreen] |
匹配全屏状态的窗口 |
atom|Window[WindowState=Minimized] |
匹配最小化状态的窗口 |
按属性选择
| 选择器 | 说明 |
|---|---|
atom|Window[IsTitleBarVisible=False] |
匹配隐藏了标题栏的窗口 |
atom|Window[Topmost=True] |
匹配置顶的窗口 |
atom|Window[CanResize=False] |
匹配不可调整大小的窗口 |
模板内部件选择
| 选择器 | 说明 |
|---|---|
atom|Window /template/ Border#WindowFrame |
窗口主框架 Border |
atom|Window /template/ ContentPresenter#WindowFrameLayer |
窗口级框架背景层 |
atom|Window /template/ ContentPresenter#TitleBarFrameLayer |
标题栏框架背景层 |
atom|Window /template/ ContentPresenter#ContentFrameLayer |
内容区框架背景层 |
atom|Window /template/ Border#ContentFrame |
内容框架(Container Query 容器) |
atom|Window /template/ DockPanel#PART_ContentLayout |
内容布局容器 |
组合选择器示例
| 选择器 | 说明 |
|---|---|
atom|Window[OsType=Linux][WindowState=Normal] |
Linux 平台正常状态的窗口(有圆角和边框) |
atom|Window[WindowState=FullScreen], atom|Window[WindowState=Maximized] |
全屏或最大化时(清除圆角和边框) |
atom|Window:not([OsType=Linux]) |
非 Linux 平台的窗口(无自定义圆角) |