mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-22 00:46:48 +08:00
7df3f29065
- 00-Index: 文档索引与快速导航 - 01-Overview: 项目概览、目录树、依赖关系、构建运行 - 02-Architecture: MVVM架构、模块划分、核心类职责(含Mermaid图) - 03-ShowCaseSystem: 72个ShowCase清单、路由注册、布局系统 - 04-WorkspaceSystem: 主窗口、导航面板、菜单系统 - 05-LocalizationSystem: LanguageProvider+Source Generator架构 - 06-IconSystem: IconProvider+Source Generator架构 - 07-TechStack: 技术栈清单(C#/Avalonia/ReactiveUI等) - 08-CodingConventions: 编码规范与ReactiveUI使用规范 - 09-RisksAndNotes: 风险、技术债、迭代检查清单
4.4 KiB
4.4 KiB
Workspace 窗口系统
1. 概述
Workspace 是 Gallery 的主窗口系统,包含窗口框架、导航面板和内容区域。它负责管理整体布局、主题切换、语言切换和窗口行为控制。
2. 核心组件
2.1 WorkspaceWindowViewModel
public class WorkspaceWindowViewModel : ReactiveObject, IScreen
{
public RoutingState Router { get; } = new RoutingState();
}
- 实现
IScreen接口,作为 ReactiveUI 路由的宿主 - 持有
RoutingState实例,管理导航堆栈 - 极简设计,仅负责路由管理
2.2 WorkspaceWindow
public partial class WorkspaceWindow : ReactiveWindow<WorkspaceWindowViewModel>
主窗口,继承自 ReactiveWindow<WorkspaceWindowViewModel>,职责包括:
- 初始化:创建 ViewModel、初始化组件、注册事件处理器
- 菜单事件处理:统一处理所有菜单项的选中状态变更
- 窗口行为控制:全屏、置顶、最小化、最大化、移动、调整大小
- 主题切换:暗色模式、紧凑模式、动效、波纹
- 语言切换:中文/英文
2.3 CaseNavigationViewModel
导航面板的 ViewModel,核心职责:
- 注册所有 ShowCase 工厂:在构造函数中通过
Locator.CurrentMutable.Register注册 72 个 ViewModel - 执行导航:
NavigateTo(showCaseId)方法 - 自动测试导航:
TestNavigatePages/StopTestNavigatePages
2.4 CaseNavigation
导航面板 View,核心职责:
- 处理导航点击:监听
NavMenu.NavMenuItemClick事件 - 查找 IScreen:在
OnAttachedToLogicalTree中向上遍历可视化树找到IScreen - 默认导航:首次附加时导航到
AboutUsViewModel.ID - 全局快捷键:F5/F6 自动测试导航
3. 窗口布局结构
graph TB
WW["WorkspaceWindow<br/>ReactiveWindow"]
Menu["窗口菜单栏<br/>系统菜单"]
Nav["CaseNavigation<br/>左侧导航面板"]
Content["RoutedViewHost<br/>内容区域"]
WW --> Menu
WW --> Nav
WW --> Content
Nav --> NM["NavMenu<br/>导航菜单控件"]
Content --> SC["ShowCaseView<br/>当前展示的 ShowCase"]
4. 菜单系统
4.1 菜单项定义
WorkspaceWindow 通过 WindowMenuItemKind 枚举定义菜单项:
| 枚举值 | 功能 | 操作 |
|---|---|---|
FullScreen |
全屏 | IsFullScreenCaptionButtonEnabled |
Pin |
置顶 | IsPinCaptionButtonEnabled |
Minimize |
允许最小化 | CanMinimize |
Maximize |
允许最大化 | CanMaximize |
Move |
允许移动 | IsMoveEnabled |
Resize |
允许调整大小 | CanResize |
DarkMode |
暗色模式 | Application.SetDarkThemeMode() |
Compact |
紧凑模式 | Application.SetCompactThemeMode() |
Motion |
动效开关 | Application.SetMotionEnabled() |
WaveSpirit |
波纹开关 | Application.SetWaveSpiritEnabled() |
LanguageZhCN |
中文 | Application.SetLanguageVariant(zh_CN) |
LanguageEnUS |
英文 | Application.SetLanguageVariant(en_US) |
4.2 事件处理机制
所有菜单项使用统一的事件处理模式:
AddHandler(MenuItem.IsCheckStateChangedEvent, HandleMenuItemCheckChanged);
通过 MenuItem.Tag 属性存储 WindowMenuItemKind 枚举值来区分不同菜单项。
4.3 联动逻辑
Motion 和 WaveSpirit 存在联动关系:
- 关闭 Motion 时,自动取消 WaveSpirit 的选中状态
- WaveSpirit 依赖 Motion 开启
5. 窗口行为控制
WorkspaceWindow 继承自 AtomUI 的窗口控件(非标准 Avalonia Window),提供以下增强功能:
| 属性 | 说明 |
|---|---|
IsFullScreenCaptionButtonEnabled |
全屏按钮是否可用 |
IsPinCaptionButtonEnabled |
置顶按钮是否可用 |
CanMinimize |
是否允许最小化 |
CanMaximize |
是否允许最大化 |
IsMoveEnabled |
是否允许移动窗口 |
CanResize |
是否允许调整窗口大小 |
6. 线程安全
主题和语言切换操作通过 Dispatcher.UIThread.Post() 确保在 UI 线程执行:
Dispatcher.UIThread.Post(() =>
{
application.SetDarkThemeMode(menuItem.IsChecked);
});
窗口行为属性(如 CanMinimize)直接设置,因为事件本身就在 UI 线程触发。
7. DevTools 集成
Debug 模式下自动附加 Avalonia DevTools:
#if DEBUG
this.AttachDevTools();
#endif
按 F12 可打开 DevTools 检查可视化树和属性。