# Window 使用文档 本文档介绍 AtomUI Window 控件的各种使用方式,示例代码参考自 Gallery 演示程序。 > 📖 Gallery 主窗口源码位置:`controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml` --- ## 前置准备 在 AXAML 中使用 Window,需要引入以下命名空间: ```xml xmlns:atom="https://atomui.net" ``` 或使用 `using` 语法: ```xml xmlns:atom="using:AtomUI.Desktop.Controls" ``` 在 C# 代码中引入: ```csharp using AtomUI.Desktop.Controls; // Window, ReactiveWindow using AtomUI.Controls; // MediaBreakPoint 等共享类型 ``` --- ## 1. 基本窗口 最基本的 Window 用法,设置标题、大小和启动位置: ```xml ``` --- ## 2. 设置窗口 Logo 通过 `Logo` 属性在标题栏显示应用程序图标: ```xml ``` > 📖 参考:`controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml` 中 Logo 设置。 --- ## 3. 配置标题按钮 Window 提供多个标题按钮配置属性,可灵活控制标题栏功能按钮的显示/隐藏: ```xml ``` 在代码中动态控制标题按钮(参考 Gallery 示例): ```csharp // 动态切换全屏按钮显示 IsFullScreenCaptionButtonEnabled = true; // 动态切换置顶按钮显示 IsPinCaptionButtonEnabled = true; // 动态切换关闭按钮可用性(macOS 下控制原生红绿灯按钮) IsCloseCaptionButtonEnabled = false; ``` > 📖 参考:`controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml.cs` 中 `HandleMenuItemCheckChanged` 方法。 --- ## 4. 隐藏标题栏 如果需要完全自定义窗口外观,可以隐藏默认标题栏: ```xml ``` --- ## 5. 控制窗口大小和拖拽 ### 限制最大尺寸为屏幕比例 ```xml ``` ### 禁用窗口拖拽 ```xml ``` ### 禁用窗口缩放 ```xml ``` ### 使用扩展方法居中窗口 ```csharp // 将窗口居中到当前所在屏幕 this.CenterOnScreen(); // 居中到指定屏幕 var screen = this.GetHostScreen(); this.CenterOnScreen(screen); ``` --- ## 6. 框架层背景 ### 窗口级框架背景 覆盖整个窗口区域(标题栏 + 内容区)的背景装饰: ```xml ``` ### 内容区域独立背景 仅为内容区域设置背景,不影响标题栏: ```xml ``` ### 标题栏独立背景 仅为标题栏设置背景色: ```xml ``` ### 带不透明度的背景图层 ```xml ``` --- ## 7. ReactiveWindow(MVVM 模式) ### 基本 MVVM 模式 `ReactiveWindow` 是推荐的 MVVM 窗口基类: **AXAML:** ```xml ``` **C# Code-behind:** ```csharp using AtomUI.Desktop.Controls; using MyApp.ViewModels; namespace MyApp.Views; public partial class MainWindow : ReactiveWindow { public MainWindow() { DataContext = new MainViewModel(); InitializeComponent(); } } ``` **ViewModel:** ```csharp using ReactiveUI; namespace MyApp.ViewModels; public class MainViewModel : ReactiveObject, IActivatableViewModel { public ViewModelActivator Activator { get; } = new(); private string _greeting = "Hello, AtomUI!"; public string Greeting { get => _greeting; set => this.RaiseAndSetIfChanged(ref _greeting, value); } } ``` ### ViewModel 自动激活 如果 ViewModel 实现了 `IActivatableViewModel`,窗口显示时自动激活 ViewModel: ```csharp public class MainViewModel : ReactiveObject, IActivatableViewModel { public ViewModelActivator Activator { get; } = new(); public MainViewModel() { this.WhenActivated(disposables => { // 窗口显示时执行 Debug.WriteLine("ViewModel activated"); // 订阅自动清理 Observable.Interval(TimeSpan.FromSeconds(1)) .Subscribe(_ => { /* 定时任务 */ }) .DisposeWith(disposables); }); } } ``` > 📖 参考:`controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml.cs` 使用了 `ReactiveWindow`。 --- ## 8. 响应媒体断点变化 Window 内置的媒体查询系统基于内容区域宽度自动计算断点: ### 通过事件响应 ```csharp public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MediaBreakPointChanged += OnMediaBreakPointChanged; } private void OnMediaBreakPointChanged(object? sender, MediaBreakPointChangedEventArgs e) { switch (e.MediaBreakPoint) { case MediaBreakPoint.ExtraSmall: // ≤ 575px:切换到紧凑布局 break; case MediaBreakPoint.Small: // ≥ 576px:显示简化侧边栏 break; case MediaBreakPoint.Medium: // ≥ 768px:显示完整侧边栏 break; case MediaBreakPoint.Large: // ≥ 992px:标准桌面布局 break; case MediaBreakPoint.ExtraLarge: // ≥ 1200px:宽屏布局 break; case MediaBreakPoint.ExtraExtraLarge: // ≥ 1600px:超宽屏布局 break; } } } ``` ### 通过属性绑定 ```xml ``` --- ## 9. macOS 特有配置 在 macOS 上精确控制原生红绿灯按钮位置: ```xml ``` > 注意:macOS 红绿灯按钮的位置和间距由 `MacOSCaptionGroupOffset` 和 `MacOSCaptionGroupSpacing` 控制,这些属性仅在 macOS 平台生效。在主题中默认值为 `(10, 2)` 和 `5`。 --- ## 10. 获取主窗口引用 在应用程序的任何位置获取主窗口引用: ```csharp // 静态方法获取主窗口 var mainWindow = Window.GetMainWindow(); if (mainWindow != null) { mainWindow.Title = "Updated Title"; } ``` --- ## 11. 窗口图标自动继承 子窗口(对话框等)如果没有设置 `Icon`,会自动从主窗口继承图标: ```csharp // 子窗口自动使用主窗口的图标 var dialog = new Window { Title = "Dialog", Width = 400, Height = 300, // Icon 不设置,会自动从主窗口继承 }; dialog.ShowDialog(this); ``` --- ## 常见组合模式 ### 标准桌面应用窗口 ```xml ``` > 📖 这正是 Gallery 主窗口 `controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml` 的结构模式。 ### 固定尺寸对话框 ```xml 取消 确定 ``` ### 带主题切换的窗口 ```csharp // 切换暗色主题 Application.Current?.SetDarkThemeMode(true); // 切换紧凑模式 Application.Current?.SetCompactThemeMode(true); // 启用/禁用动画 Application.Current?.SetMotionEnabled(false); ``` > 📖 参考:`controlgallery/AtomUIGallery/Workspace/Views/WorkspaceWindow.axaml.cs` 中完整的主题切换实现。