FancyZones 编辑器是一个独立的 WPF 应用程序,它提供了一个图形界面,用于在 FancyZones PowerToy 中创建、编辑和管理窗口布局区域。该编辑器允许用户使用基于网格或基于画布的方法定义自定义区域布局,配置布局属性,并分配键盘快捷键以快速切换布局。
有关核心 FancyZones 模块和区域管理的信息,请参阅 FancyZones。
FancyZones 编辑器遵循模型-视图-控制器模式,其中独立的组件负责 UI 呈现、布局建模和数据持久化。
来源: src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs1-245 src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs1-673 src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs1-350
MainWindow 作为主要界面,以网格视图显示可用的布局模板和自定义布局。它提供显示器选择功能和布局管理操作。
主要职责
| 组件 | 文件 | 目的 |
|---|---|---|
| 布局网格视图 | MainWindow.xaml:208-281 | 显示可用布局 |
| 显示器选择 | MainWindow.xaml:326-348 | 选择目标显示器 |
| 编辑对话框 | MainWindow.xaml:373-692 | 配置布局属性 |
| 新建布局对话框 | MainWindow.xaml | 创建新布局 |
来源: src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs48-75 src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml1-900
编辑器系统为不同布局类型提供专用界面
处理基于网格的布局,包含行、列和可调整大小的区域。支持区域分割、合并和键盘导航。
主要功能
Shift+S 进行区域分割管理自由格式画布布局,其中区域可以独立定位和调整大小。
主要功能
来源: src/modules/fancyzones/editor/FancyZonesEditor/GridEditor.xaml.cs40-66 src/modules/fancyzones/editor/FancyZonesEditor/CanvasEditor.xaml.cs23-30
布局系统使用多态层次结构来表示不同的布局类型。
来源: src/modules/fancyzones/editor/FancyZonesEditor/Models/LayoutModel.cs17-409 src/modules/fancyzones/editor/FancyZonesEditor/Models/GridLayoutModel.cs14-409 src/modules/fancyzones/editor/FancyZonesEditor/Models/CanvasLayoutModel.cs12-207
| 类型 | 描述 | 实现 |
|---|---|---|
空白 | 空布局 | 零区域的 CanvasLayoutModel |
重点 | 单个大区域 | 一个区域的 CanvasLayoutModel |
列 | 垂直列布局 | 1行,N列的 GridLayoutModel |
行 | 水平行布局 | N行,1列的 GridLayoutModel |
网格 | 基本网格布局 | 等大单元格的 GridLayoutModel |
PriorityGrid | 带优先区域的网格 | 预定义模式的 GridLayoutModel |
自定义 | 用户创建的布局 | 任一模型类型 |
来源: src/modules/fancyzones/editor/FancyZonesEditor/Models/MainWindowSettingsModel.cs49-88
编辑器工作流管理视图、编辑和保存布局之间的过渡。
来源: src/modules/fancyzones/editor/FancyZonesEditor/MainWindow.xaml.cs333-361 src/modules/fancyzones/editor/FancyZonesEditor/EditorWindow.cs22-57
FancyZonesEditorIO 类通过一系列专用解析器和序列化器处理所有数据持久化操作。
| 操作 | 方法 | 文件格式 |
|---|---|---|
| 编辑器参数 | ParseParams() | JSON 配置 |
| 已应用的布局 | ParseAppliedLayouts() | JSON 布局分配 |
| 布局热键 | ParseLayoutHotkeys() | JSON 键绑定 |
| 模板布局 | ParseLayoutTemplates() | JSON 模板定义 |
| 自定义布局 | ParseCustomLayouts() | JSON 自定义设计 |
| 默认布局 | ParseDefaultLayouts() | JSON 默认分配 |
来源: src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs263-319 src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs396-498
编辑器通过 Overlay 类管理多个显示器配置,该类协调主窗口和每个显示器的布局窗口。
| 类 | 职责 |
|---|---|
Overlay | 管理多个显示器窗口和布局协调 |
Monitor | 表示具有布局设置的单个显示器 |
Device | 显示器属性的硬件抽象 |
LayoutOverlayWindow | 显示布局预览的每个显示器窗口 |
来源: src/modules/fancyzones/editor/FancyZonesEditor/Overlay.cs16-136 src/modules/fancyzones/editor/FancyZonesEditor/Models/Monitor.cs14-100 src/modules/fancyzones/editor/FancyZonesEditor/Models/Device.cs12-90
编辑器作为 PowerToys Runner 的子进程启动,并通过以下方式进行通信:
布局配置通过以下方式与主 PowerToys 设置系统集成:
来源: src/modules/fancyzones/editor/FancyZonesEditor/App.xaml.cs88-155 src/modules/fancyzones/editor/FancyZonesEditor/Utils/FancyZonesEditorIO.cs35-123