feat.融合桌面可靠性改进

This commit is contained in:
lincube
2026-06-08 01:28:28 +08:00
parent 11b8216e5b
commit 1a6f129e78
10 changed files with 1930 additions and 7 deletions

View File

@@ -0,0 +1,328 @@
# 阑山桌面融合桌面功能全面分析报告
**生成时间**: 2026-06-08
**分析范围**: 融合桌面组件系统、编辑模式、布局引擎、交互逻辑
---
## 执行摘要
融合桌面Fused Desktop是阑山桌面的核心功能之一允许用户在系统桌面负一屏上放置和管理桌面组件。经过全面分析发现以下**关键问题**
### 🔴 严重问题
1. **编辑模式控制缺失** - 组件库窗口的打开/关闭未正确触发编辑模式进入/退出
2. **组件尺寸调整功能缺失** - 无法在编辑模式下调整组件大小
3. **底部对齐问题** - 组件可能无法正确置于屏幕底部(需验证)
### 🟡 中等问题
4. **编辑模式交互边界模糊** - 编辑模式下组件的交互状态管理不完整
5. **网格吸附逻辑不一致** - 添加组件和拖拽组件的吸附行为可能存在差异
### 🟢 已实现的良好设计
- ✅ 预览布局计算系统完整(`FusedDesktopLibraryPreviewLayout`
- ✅ 网格计算引擎健全(`FusedDesktopEditGridAdapter``FusedDesktopPlacementMath`
- ✅ 窗口层级管理完整(`BottomMost` 服务)
- ✅ 持久化存储设计合理(`FusedDesktopLayoutService`
---
## 详细问题分析
### 问题 1: 编辑模式控制流缺失 ⭐⭐⭐⭐⭐
**当前状态**:
- `FusedDesktopComponentLibraryWindow` 在打开时注册到 `MainWindow`
-**未调用** `FusedDesktopManagerService.EnterEditMode()`
- 窗口关闭时注销,但 **未调用** `ExitEditMode()`
**规格要求** (来自 spec.md):
> The fused desktop component library is the edit-mode boundary. Opening the independent Fluent-style library window enters fused desktop edit mode. Closing that window exits edit mode.
**影响**:
- 用户打开组件库后,桌面组件窗口仍然可以被交互,而非进入拖拽模式
- 编辑模式的视觉反馈光标变化、hit-test 禁用)不生效
**代码位置**:
- `LanMountainDesktop/Views/FusedDesktopComponentLibraryWindow.axaml.cs:27-29`
- `LanMountainDesktop/Views/FusedDesktopComponentLibraryWindow.axaml.cs:108-116`
**修复方案**:
```csharp
// 在 FusedDesktopComponentLibraryWindow 构造函数中
var mainWindow = (Application.Current?.ApplicationLifetime as IClassicDesktopStyleApplicationLifetime)?.MainWindow as MainWindow;
mainWindow?.RegisterFusedLibraryWindow(this);
FusedDesktopManagerServiceFactory.GetOrCreate().EnterEditMode(); // 添加此行
// 在 OnClosed 方法中
protected override void OnClosed(EventArgs e)
{
FusedDesktopManagerServiceFactory.GetOrCreate().ExitEditMode(); // 添加此行
LibraryControl.AddComponentRequested -= OnAddComponentRequested;
KeyDown -= OnWindowKeyDown;
base.OnClosed(e);
// ...
}
```
---
### 问题 2: 组件尺寸调整功能完全缺失 ⭐⭐⭐⭐⭐
**当前状态**:
- `DesktopWidgetWindow` 仅支持拖拽移动
- 无尺寸调整手柄resize handles
- 无尺寸调整逻辑
**规格要求** (来自用户需求):
> 逐步推进融合桌面组件编辑功能的实现,保障融合桌面的组件在编辑模式下也能够正常的调整组件的大小与尺寸,还有比例。
**影响**:
- 用户无法在编辑模式下改变组件尺寸
- 这是核心编辑功能的缺失
**实现复杂度**: 高
**预计工作量**: 3-5 小时
**需要实现的组件**:
1. **ResizeHandle** 控件 - 8个方向的调整手柄四角 + 四边)
2. **ResizeGesture** 检测 - 识别在编辑模式下的手柄拖拽
3. **GridConstrainedResize** 逻辑 - 确保调整后仍然对齐网格
4. **MinSize 约束** - 尊重 `MinWidthCells``MinHeightCells`
5. **Persistence** - 持久化新的尺寸到 `FusedDesktopLayoutSnapshot`
**参考阑山桌面组件编辑逻辑**:
- 阑山桌面主界面有完整的组件拖拽和调整系统
- 应该复用 `DesktopPlacementMath.GetSnappedCell` 逻辑
- 需要参考 `MainWindow.DesktopEditing.cs` 的实现模式
---
### 问题 3: 底部对齐验证需求 ⭐⭐⭐
**用户需求**:
> 保障组件能够正常置于底部
**当前实现分析**:
- 使用 `WorkingArea` 计算视口尺寸
- 使用 `DesktopGridGeometry` 计算网格范围
- 网格原点设置为 `(EdgeInsetPx, EdgeInsetPx)`
**潜在风险点**:
1. **EdgeInset 计算** - 是否正确处理了底部边距?
2. **Grid RowCount** - 网格行数是否能覆盖到屏幕底部?
3. **Snap 逻辑** - 拖拽到底部时是否正确吸附?
**验证方法**:
```csharp
// 测试用例:创建一个组件并手动拖拽到屏幕底部
// 预期:组件应该能够吸附到最底部的网格行,不超出 WorkingArea
```
**代码位置**:
- `LanMountainDesktop/DesktopEditing/FusedDesktopEditGridAdapter.cs:46-50`
- `LanMountainDesktop/DesktopEditing/FusedDesktopPlacementMath.cs:45-84`
---
### 问题 4: 编辑模式交互边界管理 ⭐⭐⭐⭐
**当前状态**:
- `DesktopWidgetWindow.SetEditMode(bool)` 正确设置了:
- `child.IsHitTestVisible = !editMode`
- `Cursor = StandardCursorType.SizeAll`
- 但缺少以下功能:
- ❌ 编辑模式视觉反馈(边框高亮、阴影等)
- ❌ 锁定组件的特殊处理(`IsLocked` 字段存在但未使用)
- ❌ 编辑模式下的右键菜单(应该显示"删除"、"锁定"等选项)
**规格要求**:
> While edit mode is active, component windows can be moved but their inner component UI is not hit-test interactive.
**改进建议**:
1. 添加编辑模式的视觉状态Border + BoxShadow
2. 实现 `IsLocked` 状态的 UI 反馈
3. 在编辑模式下显示不同的右键菜单
---
### 问题 5: 网格吸附一致性 ⭐⭐⭐
**观察到的不一致**:
**添加组件时** (`FusedDesktopManagerService.AddComponent`):
- 使用 `FusedDesktopPlacementMath.CreateCenteredPlacement`
- 将组件居中放置在网格中央
**拖拽释放时** (`DesktopWidgetWindow.EndDrag`):
- 使用 `FusedDesktopPlacementMath.SnapToNearestCell`
- 吸附到最近的网格单元
**潜在问题**:
- 如果组件比网格大(跨多行/列),吸附逻辑是否正确?
- `EstimateCellSpan` 方法的估算是否准确?
**测试场景**:
1. 添加一个 4x4 的大组件
2. 拖拽到网格边缘
3. 验证是否正确吸附且不超出网格边界
---
## 架构优势分析
### ✅ 优秀的设计
#### 1. 分层清晰的网格系统
```
DesktopGridGeometry (数据)
FusedDesktopEditGridAdapter (适配器)
FusedDesktopPlacementMath (算法)
DesktopWidgetWindow (UI)
```
#### 2. 预览布局计算的智能化
- `FusedDesktopLibraryPreviewLayout.Calculate`
- 保持组件宽高比 ✅
- 自适应舞台尺寸 ✅
- 容错处理(非有限值、零尺寸) ✅
- 单元测试覆盖完整 ✅
#### 3. 服务层设计模式
- Singleton Factory 模式(`FusedDesktopManagerServiceFactory`
- 依赖注入(`ISettingsFacadeService`
- 接口隔离(`IFusedDesktopLayoutService`
#### 4. 持久化设计
- JSON 序列化 + 原子写入(临时文件 + Move
- 内存缓存 + Clone 防止意外修改
- 错误处理完整
---
## 风险评估矩阵
| 问题 | 严重程度 | 用户影响 | 修复复杂度 | 优先级 |
|------|---------|---------|-----------|--------|
| 编辑模式控制缺失 | 🔴 高 | 🔴 高 | 🟢 低 | P0 |
| 尺寸调整功能缺失 | 🔴 高 | 🔴 高 | 🔴 高 | P0 |
| 底部对齐验证 | 🟡 中 | 🟡 中 | 🟢 低 | P1 |
| 编辑模式交互边界 | 🟡 中 | 🟢 低 | 🟡 中 | P1 |
| 网格吸附一致性 | 🟡 中 | 🟢 低 | 🟢 低 | P2 |
---
## 推荐实施计划
### 阶段 1: 核心功能修复 (1-2 天)
**任务 1.1: 修复编辑模式控制流** (0.5 小时)
- [ ]`FusedDesktopComponentLibraryWindow` 构造函数中调用 `EnterEditMode()`
- [ ]`OnClosed` 中调用 `ExitEditMode()`
- [ ] 测试验证:打开组件库后,桌面组件光标变为 `SizeAll`
**任务 1.2: 实现组件尺寸调整** (4-6 小时)
- [ ] 创建 `ResizeHandleAdorner` 控件8个手柄
- [ ]`DesktopWidgetWindow` 中添加 resize 手势检测
- [ ] 实现 `ApplyResizeToGrid` 方法(约束到网格 + 最小尺寸)
- [ ] 持久化调整后的尺寸
- [ ] 添加单元测试
**任务 1.3: 验证底部对齐** (1 小时)
- [ ] 手动测试拖拽组件到屏幕底部
- [ ] 如发现问题,调整 `FusedDesktopEditGridAdapter` 的 EdgeInset 计算
- [ ] 确保 RowCount 覆盖完整的工作区
### 阶段 2: 交互体验优化 (1 天)
**任务 2.1: 编辑模式视觉反馈** (2 小时)
- [ ] 添加编辑模式下的 Border 高亮
- [ ] 添加半透明覆盖层(可选)
- [ ] 显示网格辅助线(可选)
**任务 2.2: 锁定功能实现** (2 小时)
- [ ] 在编辑模式右键菜单添加"锁定"选项
- [ ] 锁定后禁用拖拽和调整尺寸
- [ ] 添加锁定状态的视觉反馈(🔒 图标)
**任务 2.3: 右键菜单增强** (1 小时)
- [ ] 编辑模式菜单:删除、锁定/解锁、属性
- [ ] 非编辑模式菜单:删除、设置
### 阶段 3: 全面测试与验证 (0.5 天)
**测试用例清单**:
1. [ ] 打开组件库 → 编辑模式激活
2. [ ] 添加组件 → 正确居中放置
3. [ ] 拖拽组件 → 正确吸附网格
4. [ ] 调整组件尺寸 → 保持网格对齐 + 最小尺寸约束
5. [ ] 拖拽到屏幕底部 → 不超出工作区
6. [ ] 拖拽到屏幕右侧 → 不超出工作区
7. [ ] 关闭组件库 → 编辑模式退出
8. [ ] 锁定组件 → 无法拖拽和调整尺寸
9. [ ] 多屏幕场景 → 组件正确吸附到所在屏幕的网格
10. [ ] 窗口缩放 → 预览布局正确调整
---
## 技术债务
### 已识别的技术债务
1. **硬编码常量** (低优先级)
- `FusedDesktopLibraryPreviewLayout` 中的 Inset 值应该可配置
2. **错误处理不完整** (中优先级)
- `CreateWidgetWindow` 的异常处理只有 log用户无感知
3. **多屏幕支持不完善** (中优先级)
- 跨屏幕拖拽时的网格切换逻辑需要验证
4. **性能优化空间** (低优先级)
- 每次拖拽都重新计算网格,可以缓存
---
## 参考资料
### 相关代码文件
**核心服务**:
- `LanMountainDesktop/Services/FusedDesktopManagerService.cs`
- `LanMountainDesktop/Services/FusedDesktopLayoutService.cs`
**UI 层**:
- `LanMountainDesktop/Views/FusedDesktopComponentLibraryWindow.axaml.cs`
- `LanMountainDesktop/Views/FusedDesktopComponentLibraryControl.axaml.cs`
- `LanMountainDesktop/Views/DesktopWidgetWindow.axaml.cs`
**布局引擎**:
- `LanMountainDesktop/DesktopEditing/FusedDesktopEditGridAdapter.cs`
- `LanMountainDesktop/DesktopEditing/FusedDesktopPlacementMath.cs`
- `LanMountainDesktop/DesktopEditing/DesktopPlacementMath.cs`
- `LanMountainDesktop/Views/FusedDesktopLibraryPreviewLayout.cs`
**数据模型**:
- `LanMountainDesktop/Models/FusedDesktopLayoutSnapshot.cs`
**测试**:
- `LanMountainDesktop.Tests/FusedDesktopLibraryPreviewLayoutTests.cs`
- `LanMountainDesktop.Tests/DesktopPlacementMathTests.cs`
### 规格文档
- `.trae/specs/fused-desktop-library-redesign/spec.md`
---
## 结论
阑山桌面的融合桌面功能拥有**坚实的架构基础**和**清晰的代码分层**,但在**编辑模式控制流**和**组件尺寸调整**两个核心功能上存在明显缺失。
**立即行动项**:
1. ✅ 修复编辑模式进入/退出逻辑(简单修改,影响大)
2. ✅ 实现组件尺寸调整功能(工作量大,但用户价值高)
3. ✅ 验证底部对齐问题(快速验证,消除风险)
完成以上三项后,融合桌面将具备完整的基础编辑能力,可以进入下一阶段的体验优化和高级功能开发。