# 修改记录 ## 2025年修改记录 ### 修复 BreathePageView 页面切换闪退问题 - **日期**: 2025年1月 - **问题**: 第一次进入 BreathePageView 没问题,导航到其他页面后再切换回来时出现 `System.ExecutionEngineException` 闪退(HResult: -2146233082) - **问题分析**: - ❌ **生命周期管理缺失**: BreathePageView 没有正确处理页面激活/停用生命周期,导致 Lottie 控件资源管理混乱 - ❌ **XAML 绑定时机问题**: 页面重新激活时,XAML 绑定立即更新 Path 属性,但 Lottie 控件的资源可能还未完全清理 - ❌ **资源释放冲突**: 当页面重新加载时,控件试图访问已经被释放或正在释放的 Skia 底层资源,导致 ExecutionEngineException - ❌ **控件实例复用**: 同一个 Lottie 控件实例在页面切换时被重复使用,导致资源状态混乱 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` (使用 ContentControl 作为容器) - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml.cs` (动态创建和销毁 Lottie 控件) - **主要修复**: - ✅ **条件渲染**: 使用 `ContentControl` 作为容器,不在 XAML 中直接放置 Lottie 控件,改为在代码后台动态创建 - ✅ **动态创建控件**: 在页面激活时(`WhenActivated`)创建全新的 Lottie 控件实例,确保每次都是干净的状态 - ✅ **完全销毁控件**: 在页面停用时,通过设置 `ContentControl.Content = null` 完全移除控件,触发控件的 `OnUnloaded` 和资源清理 - ✅ **生命周期管理**: 使用 `WhenActivated` 管理页面生命周期,确保控件在正确的时机创建和销毁 - ✅ **订阅管理**: 正确管理 `RepeatCount` 和 `AnimationPath` 的订阅,在停用时自动清理 - ✅ **线程安全**: 所有 UI 操作都通过 `Dispatcher.UIThread.Post` 在 UI 线程上执行 - ✅ **异常处理**: 添加 try-catch 捕获所有异常,避免崩溃 - **技术细节**: - 在 XAML 中使用 `` 作为容器 - 在 `CreateLottieControl` 方法中动态创建新的 `Lottie` 控件实例 - 设置控件的初始属性(RepeatCount、Stretch、对齐方式等) - 订阅 `ViewModel.RepeatCount` 和 `ViewModel.AnimationPath` 变化 - 将控件添加到 `ContentControl.Content`,触发加载和初始化 - 在 `DestroyLottieControl` 中设置 `Content = null`,触发控件的卸载和资源清理 - 所有订阅都添加到 `CompositeDisposable`,确保在停用时自动清理 - **效果**: - ✅ **页面切换正常**: 每次页面激活时创建全新的控件实例,避免了资源冲突 - ✅ **资源管理正确**: 通过完全移除控件,确保 Skia 资源被正确释放 - ✅ **异常安全**: 即使出现异常,也不会导致应用崩溃,只会记录日志 - ✅ **彻底解决**: 通过动态创建和销毁控件,从根本上避免了 ExecutionEngineException ### 新增文件浏览页面 - **日期**: 2025年11月14日 - **调整内容**: 1. 新增 `FileExplorerPageViewModel` 与 `FileExplorerPageView`,实现“上方目录选择 + 下方左右布局”,左侧统计文件数量并展示可展开的文件树,右侧通过 AvaloniaEdit 预览内容(`xmlns:avaloniaEdit="clr-namespace:AvaloniaEdit;assembly=AvaloniaEdit"`)。 2. 将页面注册到 DI 与导航:`ServiceCollectionExtensions`、`PageViewModelFactory`、`NavigationService` 新增 `file-explorer` 项,侧边菜单可直接进入“文件浏览”工具。 3. 为顶部容器设置三列 `Grid.Column`,分别承载说明文本、目录路径文本框与操作按钮,避免控件堆叠;文件树标题/描述分别占 `Grid.Row="0/1"`,并改用 `TreeView` 展示目录层级,点击节点即可预览文件。 4. 右侧预览区加入“语法高亮”下拉框,绑定新属性 `SelectedHighlightLanguage`;支持自动按扩展名检测(C#/JSON/YAML/Markdown 等),并通过 `TextMateHelper` 在 `TextEditor` 中切换语言。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/FileExplorerPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/FileExplorerPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/FileExplorerPageView.axaml.cs` - `AuroraDesk.Presentation/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Presentation/Services/PageViewModelFactory.cs` - `AuroraDesk.Infrastructure/Services/NavigationService.cs` - **效果**: - ✅ 目录选择 + 列表 + AvaloniaEdit 预览一屏完成,方便快速阅读文件。 - ✅ 顶部与列表区域不再发生文字重合,控件分区清晰。 - ✅ 导航菜单出现“文件浏览”入口,可随时切换。 ### 文件浏览页面新增搜索框 - **日期**: 2025年11月14日 - **调整内容**: 1. 为 `FileExplorerPageViewModel` 新增 `SearchQuery`、`FilteredTreeItems` 以及节点克隆过滤逻辑,根据关键字实时筛选文件树。 2. 在 `LoadDirectoryAsync` 结束后自动同步筛选结果,保持计数信息与过滤列表一致。 3. 在 `FileExplorerPageView` 左侧文件树上方加入搜索框,输入内容时立即按名称匹配文件或文件夹。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/FileExplorerPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/FileExplorerPageView.axaml` - **效果**: - ✅ 文件树可按关键字快速定位目标,提升大型目录下的浏览效率。 - ✅ 过滤结果保持原有层级结构,仅展示匹配节点及其父级上下文。 ### 调整 breathe 系列动画画布宽度 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `breathe.json` 与 `breatheV2.json` 的合成宽度从 680 提升至 960,并把两层文字图层的 `p.x` 调整为 480(新宽度的一半),留足左右余量。 2. 保持高度和缩放不变,仅扩充画布以容纳霓虹外发光区域。 - **涉及文件**: - `AuroraDesk.Presentation/Resources/Animations/breathe.json` - `AuroraDesk.Presentation/Resources/Animations/breatheV2.json` - **效果**: - ✅ “AVALONIA” 与 “WELCOME BACK” 再无左右被裁剪的问题,光晕完整可见。 ### 修复 breathe 动画字体缺失导致崩溃 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `breathe.json` 与 `breatheV2.json` 的字体信息由 `STHupo` 改为应用内置的 `Inter`,避免依赖系统是否安装华文琥珀字体。 2. 同步更新两段文本样式的 `f` 字段,并把填充色改为高饱和蓝色,保证浅色背景下也能明显看到文字。 3. 修复 `breathe.json` 中 Drop Shadow 参数名出现乱码导致 JSON 无效的问题,改用英文字符串(Opacity/Softness/Shadow Only)。 - **涉及文件**: - `AuroraDesk.Presentation/Resources/Animations/breathe.json` - `AuroraDesk.Presentation/Resources/Animations/breatheV2.json` - **效果**: - ✅ `breathe.json`/`breatheV2.json` 在任意设备上都能立即显示文本内容,不再出现空白。 - ✅ Tab 之间切换不再触发 `System.ExecutionEngineException`,Lottie 控件释放/重建稳定。 ### 重构呼吸页面并解除 Lottie 裁剪 - **日期**: 2025年11月14日 - **调整内容**: 1. 重新组织 `BreathePageView` 布局:顶部保留标题区,下方改为“左侧控制面板 + 右侧预览卡片”的两列结构,加入动画资源信息卡、播放设置卡与更醒目的 V3 提示。 2. 右侧预览区采用深色画布 + `Viewbox` 自适应缩放,整体卡片使用大圆角与更充足的留白,视觉风格与其他页面保持一致。 3. 为动画容器和 `lottie:Lottie` 控件设置 `ClipToBounds="False"`,并嵌入 `Viewbox`,确保 `breatheV2.json` 中带有负偏移的霓虹光晕不会被边框裁剪。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 呼吸页面的基础信息、动画选择与播放状态分区明确,界面更现代。 - ✅ Lottie 动画可完整展示 “WELCOME BACK” 文本与外扩光效,彻底消除左侧被截断的问题。 ### 优化呼吸动画实时预览卡片 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `BreathePageView` 右侧预览区域由深色背景改为浅色渐变卡片,采用双层圆角 + 柔和描边,与整页风格保持一致。 2. 保留 `Viewbox` 自适应缩放并添加提示语与所选动画名称徽章,确保 `breathe.json` / `breatheV2.json` 等不同画布能在统一边界内完整显示。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 预览卡片视觉更轻盈,与左侧控制面板色调统一。 - ✅ 动画得到充分留白,宽幅文本不再与黑背景冲突。 ### 调整 TCP 客户端消息输入位置 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `TcpClientPageView` 中的消息输入框和发送按钮移至会话详情底部的独立卡片,避免与“已发送消息”列表混排。 2. 保留原有列表虚拟化结构,接收消息区域布局不受影响。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/TcpClientPageView.axaml` - **效果**: - ✅ 发送输入区位置更符合用户预期,界面层级更清晰。 - ✅ 接收消息容器与统计展示保持原样,交互逻辑未受影响。 ### 调整呼吸动画展示区域铺满 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `BreathePageView` 动画容器的对齐方式改为水平/垂直拉伸,允许边框随父容器铺满。 2. 移除 Lottie 控件的固定宽高,改用拉伸对齐以按可用空间呈现动画。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 呼吸动画在内容区域内自动拉伸显示,视觉更协调。 - ✅ 保持圆角与边框效果,未引入布局断裂。 ### 修复呼吸动画首字母被裁剪 - **日期**: 2025年11月14日 - **调整内容**: 1. 将预览区域 `Viewbox` 的 `MaxWidth` 提升至 1200,与最新 `breathe.json` 画布一致。 2. 移除 `Viewbox` 四周 36px 边距,确保动画可获得完整宽度。 3. 同步扩充 `breathe.json` 合成宽度并将文字位置改为 `x=600`,彻底消除首字母被裁剪的问题。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - `AuroraDesk.Presentation/Resources/Animations/breathe.json` - **效果**: - ✅ “AVALONIA” 文本首字母不再被裁剪,光晕完整显示。 - ✅ 其它呼吸动画同样可利用更宽画布,避免边缘截断。 ### 呼吸动画资源信息支持切换 - **日期**: 2025年11月14日 - **调整内容**: 1. 将动画资源说明文本改为绑定 `AnimationPath`,通过 `StringFormat` 展示当前路径。 2. 当页面切换不同动画资源时,文本会实时更新,无需修改 XAML。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 动画资源路径展示可随绑定变化自动刷新。 - ✅ 便于后续通过 ViewModel 切换不同动画文件。 ### 呼吸动画页面支持多个资源切换 - **日期**: 2025年11月14日 - **调整内容**: 1. 为 `BreathePageViewModel` 新增动画资源列表与所选项绑定,预置 `breathe.json`、`capability.json`。 2. 在 `BreathePageView` 中加入下拉选择控件,绑定至 ViewModel,选项变更时自动更新动画路径。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/BreathePageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 页面可快速切换不同 Lottie 资源,无需修改代码。 - ✅ 资源说明文本与动画展示同步更新,体验一致。 ### 呼吸动画替换 capability 资源 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `breatheV2.json` 拷贝至 `Resources/Animations`,并在 `BreathePageViewModel` 中以“呼吸引导 V2”形式加入动画列表。 2. 移除无效的 `capability.json` 选项及对应文件,确保用户只看到可播放的 Lottie 资源。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/BreathePageViewModel.cs` - `AuroraDesk.Presentation/Resources/Animations/breatheV2.json` - `AuroraDesk.Presentation/Resources/Animations/capability.json`(已删除) - `capability.json`(已删除) - **效果**: - ✅ “能力演示”选项改为可用的 V2 动画,切换后立即生效。 - ✅ 避免加载配置文件导致 Lottie 控件空白的问题。 ### 优化 breatheV2 “WELCOME BACK” 动画 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `breatheV2.json` 的文本更新为 “WELCOME BACK” 单行霓虹效果,并应用蓝青色描边与荧光色填充,突出“欢迎回来”主题。 2. 调整双层投影的颜色、距离与柔和度,呈现更科幻的霓虹发光效果。 3. 多次迭代后采用左移 30px + 深度压缩布局(字号 95、缩放 60%、行距 120、轻微负字距),确保 680×280 画布内完整呈现、左右留白均匀。 - **涉及文件**: - `AuroraDesk.Presentation/Resources/Animations/breatheV2.json` - **效果**: - ✅ 新动画展现出更具科技感且完整的欢迎视觉,左右留白均衡。 - ✅ Lottie 结构保持不变,仍可在 `BreathePageView` 中稳定循环播放。 ### 缩放 breathe.json 避免截断 - **日期**: 2025年11月14日 - **调整内容**: 1. 将 `breathe.json` 两层文字的缩放从 100% 降至 85%,字号从 192 调整为 150,并把行距降至 180。 2. 文本对齐方式改为居中(`j=2`),确保 “AVALONIA” 在 680×280 画布内水平居中展示,不再出现左右裁切。 - **涉及文件**: - `AuroraDesk.Presentation/Resources/Animations/breathe.json` - **效果**: - ✅ 默认动画与 V2/V3 一样能完整显示,且视觉集中在容器正中。 - ✅ Lottie 文件结构保持兼容,仍可在 Breathe 页面中循环播放。 ### 新增 breathe_V3 科技律动动画 - **日期**: 2025年11月14日 - **调整内容**: 1. 解除 `breathe_V3.json` 只读属性并纳入 `Resources/Animations`,供页面加载。 2. 在 `BreathePageViewModel` 的动画列表中新增“科技律动 V3”选项,路径指向 `breathe_V3.json`。 3. 在 `BreathePageView.axaml` 中补充提示卡片,引导用户选择最新动画资源。 - **涉及文件**: - `AuroraDesk.Presentation/Resources/Animations/breathe_V3.json` - `AuroraDesk.Presentation/ViewModels/Pages/BreathePageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 主页面可直接切换到 V3 动画,提示区域也醒目展示新资源信息。 - ✅ 所有动画选项均为有效 Lottie 文件,避免空白加载。 ### 调整动画显示尺寸避免内容被裁剪 - **日期**: 2025年11月14日 - **调整内容**: 1. 将呼吸动画控件对齐方式改为居中,不再随容器拉伸。 2. 为 Lottie 控件增加最大宽高(680×280),保证文本在放大时不被裁剪。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/BreathePageView.axaml` - **效果**: - ✅ 动画文字保持完整可见,避免铺满后出现截断。 - ✅ 仍然维持适度缩放,居中展示更清晰。 ### 新增 TCP 客户端多会话视图 - **日期**: 2025年11月13日 - **调整内容**: 1. 新建 `TcpClientPageView` XAML,延续 UDP 页面卡片化风格,新增顶部全局统计、左侧会话列表和右侧详情区,支持多会话并列管理。 2. 详情区围绕选中会话提供连接配置、帧类型/CRC 开关、发送与接收双栏布局,并引入自动置底、重连入口等交互元素。 3. 实现 `TcpClientPageViewModel` 与 `TcpClientSessionViewModel`,遵循「长度 + 类型 + payload (+ CRC32)」协议构帧,支持多会话异步连接、发送、接收与 CRC 校验。 4. 重写页面代码后台为强类型订阅,按选中会话自动定位到最新消息,同时更新导航、依赖注入以开放 `TCP 客户端` 菜单。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/TcpClientPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/TcpClientPageView.axaml.cs` - `AuroraDesk.Presentation/ViewModels/Pages/TcpClientPageViewModel.cs` - `AuroraDesk.Presentation/ViewModels/Pages/TcpClientSessionViewModel.cs` - `AuroraDesk.Presentation/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Presentation/Services/PageViewModelFactory.cs` - `AuroraDesk.Infrastructure/Services/NavigationService.cs` - **效果**: - ✅ 一次性落地 TCP 多会话能力,自动完成协议封包、CRC 追加/校验与回显。 - ✅ UI 与逻辑均已就绪,可直接在导航中创建/切换会话并查看实时收发记录。 ### 为 UDP 客户端接收消息添加自动滚动控制 - **日期**: 2025年11月10日 - **调整内容**: 1. 在 `UdpClientPageView` 接收消息标题栏新增“滚动到底部”复选框,默认开启。 2. 引入 `IsAutoScrollToBottom` 属性控制是否在收到新消息时自动将滚动条置底。 3. 在视图代码后台监听消息集合变化,根据复选框状态自动滚动到底部。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/UdpClientPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml.cs` - **效果**: - ✅ 用户可按需开启/关闭自动滚动,防止查看历史记录时被打断。 - ✅ 默认保持自动滚动,确保实时看到最新消息。 ### 新增 Plink SSH 多会话管理页面 - **日期**: 2025年11月11日 - **调整内容**: 1. 在核心层新增 `PlinkSessionOptions/Info/Message` 等数据模型与 `IPlinkSessionService` 接口,抽象 SSH (plink) 会话的启动、消息流与状态订阅。 2. 基础设施层落地 `PlinkSessionService`,通过并发字典管理多会话生命周期,异步泵送 stdout/stderr,支持实时消息、错误提示与安全退出。 3. 表示层新增 `PlinkPageViewModel`、`PlinkSessionItemViewModel` 以及对应视图 `PlinkPageView`,实现会话表单创建、列表管理、消息实时显示与指令输入。 4. 新建会话交互重构:基础信息采用两列卡片布局,认证方式新增密码/私钥单选切换并按模式启用控件;高级设置收纳进 Expander,默认界面更聚焦。 5. 将 “当前会话” 列表移至右侧独立列,保留中间区域用于实时消息与指令输入,整体信息分区更清晰。 6. 新增 `PlinkMessageBackgroundConverter`、空值反转转换器等 UI 工具,并完善命令/调度逻辑(Dispatcher.UIThread)确保线程安全。 7. 更新 DI 容器与导航(ServiceCollectionExtensions、PageViewModelFactory、NavigationService),在侧边栏新增 “SSH 工具 > Plink 会话” 菜单。 - **涉及文件**: - `AuroraDesk.Core/Entities/PlinkSessionModels.cs` - `AuroraDesk.Core/Interfaces/IPlinkSessionService.cs` - `AuroraDesk.Infrastructure/Services/PlinkSessionService.cs` - `AuroraDesk.Infrastructure/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Infrastructure/Services/NavigationService.cs` - `AuroraDesk.Presentation/ViewModels/Pages/PlinkPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml.cs` - `AuroraDesk.Presentation/Converters/PlinkMessageConverters.cs` - `AuroraDesk.Presentation/Converters/StringConverters.cs` - `AuroraDesk.Presentation/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Presentation/Services/PageViewModelFactory.cs` - **效果**: - ✅ 支持创建/管理任意数量的 Plink 会话,状态与消息实时响应。 - ✅ 列表与消息区具备现代化界面与语义化颜色,易于运维排查。 - ✅ 导航栏新增 SSH 工具分类,功能入口清晰可见。 ### 修复 Plink 基本信息表单布局重叠 - **日期**: 2025年11月11日 - **调整内容**: 1. 为 `PlinkPageView` 基本信息区域的两列网格补充 `RowDefinition` 配置,确保上下字段按照行排列。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - **效果**: - ✅ “主机/端口”“用户名/显示名称” 字段分行显示,避免横向挤压与重叠。 ### Plink 新建会话表单对齐 SSH 风格 - **日期**: 2025年11月11日 - **调整内容**: 1. 将 `PlinkPageView` 顶部表单改为 `Expander + Grid` 结构,复用 `SshPageView` 的列/行布局与标题样式,保持 `MaxHeight=240`。 2. 单行展示主机、端口、用户名、显示名称;认证行整合密码与附加参数;私钥路径与 Plink 路径并列于第三行。 3. 统一按钮与状态提示的并排布局,将“自动接受主机密钥”复选框与操作行同行展示,使交互逻辑与 SSH 页面保持一致。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - **效果**: - ✅ Plink 与 SSH 页面在视觉与交互上保持一致,用户迁移成本低。 - ✅ 关键字段一屏可见,表单高度受控且更易填写。 ### Plink 页面布局与 SSH 页面保持一致 - **日期**: 2025年11月11日 - **调整内容**: 1. 将 Plink 页面顶级容器改为上下布局,上方保留表单卡片,下方按 `320,16,*` 分栏重排列表与详情,复用 SSH 页面的结构。 2. 调整表单内部栅格,延续“标签+输入”组合列宽,同时保留 Plink 特有的附加参数、可执行路径与自动接受主机密钥选项。 3. 将会话列表置于左侧卡片,保持标题徽章与操作按钮样式,与右侧详情区形成与 SSH 页面一致的视觉分区。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - **效果**: - ✅ Plink 与 SSH 页面拥有统一的布局骨架,用户切换工具时体验一致。 - ✅ 表单、列表与消息区排布协调,整体视觉层级更清晰。 ### Plink 表单折叠区提高高度上限 - **日期**: 2025年11月11日 - **调整内容**: 1. 将 “新建 Plink 会话” 卡片的 `MaxHeight` 从 240 提升至 300,确保附加参数与 Plink 路径等字段在折叠头展开时全部可见。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - **效果**: - ✅ 表单展开时不再裁剪底部内容,填写体验更顺畅。 ### 阻止连接失败的 Plink 会话被添加 - **日期**: 2025年11月11日 - **调整内容**: 1. `PlinkPageViewModel` 在创建会话后等待短暂握手窗口,若状态回落为 `Error/Disconnected` 则移除并提示失败原因。 2. 捕获异常路径提前释放创建中的 `ViewModel` 资源,防止潜在泄漏。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/PlinkPageViewModel.cs` - **效果**: - ✅ “创建并连接会话” 在连接失败时不再向“当前会话”列表添加无效项,并显示详细错误信息。 ### 新增独立 SSH 会话管理页面 - **日期**: 2025年11月11日 - **调整内容**: 1. 核心层新增 `SshSessionOptions/Info/Message` 数据模型与 `ISshSessionService` 接口,定义多会话 SSH 能力。 2. 基础设施层实现 `SshSessionService`,基于系统 `ssh` 可执行文件支持多会话、自动响应密码/私钥口令提示与日志推送。 3. 表示层新增 `SshPageViewModel`、`SshSessionItemViewModel` 与 `SshPageView`,复用三列布局展示表单、消息区与会话列表。 4. 更新 DI、导航与页面工厂,为 SSH 工具分组增加“SSH 会话”入口。 - **涉及文件**: - `AuroraDesk.Core/Entities/SshSessionModels.cs` - `AuroraDesk.Core/Interfaces/ISshSessionService.cs` - `AuroraDesk.Infrastructure/Services/SshSessionService.cs` - `AuroraDesk.Infrastructure/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Infrastructure/Services/NavigationService.cs` - `AuroraDesk.Presentation/Extensions/ServiceCollectionExtensions.cs` - `AuroraDesk.Presentation/Services/PageViewModelFactory.cs` - `AuroraDesk.Presentation/ViewModels/Pages/SshPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml.cs` - **效果**: - ✅ 新页面独立管理基于 `ssh.exe` 的实时会话,支持多客户端并行、消息推送与命令发送。 - ✅ 表单支持密码或私钥两种认证方式,可配置首选 Shell、自动接受主机密钥与自定义执行路径。 ### 重构 SSH 会话页面布局 - **日期**: 2025年11月11日 - **调整内容**: 1. 将 `SshPageView` 顶层布局调整为上下结构,上部保留新建会话表单,下部重排为左右分栏呈现客户端列表与消息详情,并将下部区域权重设为 2/3。 2. 移除“高级设置”折叠区,并将表单放入可折叠的 `Expander`,默认展开,提升页面聚焦度与可折叠性。 3. 重新组织列表与消息区的边框、提示文案,左侧列表与右侧内容的关联关系更直观。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 新建表单置顶集中,填写流程更顺滑。 - ✅ 下方左右分栏一眼区分“客户端”与“收发内容”,定位操作更轻松。 - ✅ 页面整体留白与层级更平衡,视觉更简洁。 ### 紧凑化 SSH 表单布局 - **日期**: 2025年11月11日 - **调整内容**: 1. 将“基本信息”“认证方式”分列排布,使用 `Grid` 横向并列呈现表单内容,显著降低整体高度。 2. 认证区域改为双列网格,密码与私钥口令同排展示,私钥路径独占一行,减少垂直空间。 3. 调整创建按钮与状态提示为整行布局,保持与新网格结构对齐。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 表单高度收紧,核心字段在一屏内即可完成填写。 - ✅ 密码/私钥配置分区更紧凑,阅读路径清晰。 - ✅ 按钮与状态信息对齐整齐,交互区块不再显得松散。 ### 让 SSH 表单控件铺满列宽 - **日期**: 2025年11月11日 - **调整内容**: 1. 为表单中 `StackPanel` 与输入控件补充 `HorizontalAlignment="Stretch"` 设置,确保列宽空间被完整利用。 2. 端口 `NumericUpDown`、密码/口令输入框与私钥路径等控件均支持随宽度扩展,避免出现控件宽度不足。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 每行控件自然铺满当前列,视觉更加平衡。 - ✅ 多列布局在宽屏下能充分展示信息,减少空白区域。 ### SSH 表单折叠头部拉伸对齐 - **日期**: 2025年11月11日 - **调整内容**: 1. 为“新建 SSH 会话” `Expander` 设置 `HorizontalAlignment="Stretch"` 与自定义 `HeaderTemplate`,复制 `UdpClientPageView` 中“连接配置”折叠栏的铺满效果。 2. 标题行增加统一边距与 18px 图标,使折叠状态仍占满整行,避免右侧空白。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 折叠状态下标题横向拉满,页面风格与其他网络工具保持一致。 - ✅ 点击区域更大,操作体验更接近 UDP 页面。 ### SSH 基本信息单行布局 - **日期**: 2025年11月11日 - **调整内容**: 1. 将基本信息四项(主机、端口、用户名、显示名称)改为单行网格排布,标签与输入框横向组合。 2. 认证区域保持折叠内第二行,采用标签+输入框单行布局,私钥路径独占第二行。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 基本信息在一行内填写完成,视觉更整洁。 - ✅ 认证信息紧随其后,占用空间更紧凑统一。 ### 压缩 SSH 新建表单高度 - **日期**: 2025年11月11日 - **调整内容**: 1. 降低折叠区上下 `Margin`、`Padding`,将输入控件内边距调整为 `6x4` 并收紧列距/行距,使表单整体高度更低。 2. 调整操作按钮与状态提示的内边距,保持视觉统一的同时减少额外空白。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ “新建 SSH 会话”卡片高度显著降低,重要信息仍然清晰可读。 - ✅ 控件间距统一更紧凑,页面首屏可展示更多内容。 ### 精简认证方式行占用 - **日期**: 2025年11月11日 - **调整内容**: 1. 移除“认证类型”标签,让密码/私钥切换单元与同排输入框在一行内对齐。 2. 私钥路径行的列跨度随之调整,保持布局紧凑。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 认证区域减少额外标签占位,视觉上更加简洁。 - ✅ 相关输入控件仍保持清晰的分隔与可读性。 ### 移除认证方式标题占位 - **日期**: 2025年11月11日 - **调整内容**: 1. 删除折叠内“认证方式”标题 `TextBlock`,直接以网格呈现,让整个版块更紧凑。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 认证区域高度进一步降低,避免重复标题造成空白。 ### 修复 Plink 页面 XAML 标签未闭合 - **日期**: 2025年11月11日 - **调整内容**: 1. 移除多余的 ``,恢复 `PlinkPageView` 顶部 `Border` 正确的标签匹配,保证 XAML 可解析。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/PlinkPageView.axaml` - **效果**: - ✅ `dotnet build` 不再因 XAML 标签错配而失败。 ### 压缩 SSH 表单高度至 240 - **日期**: 2025年11月11日 - **调整内容**: 1. 将“新建 SSH 会话”卡片改为三行网格:基础信息行、认证行、操作行,移除多余 StackPanel,设置 `MaxHeight="240"`。 2. 基础信息与认证字段采用紧凑列分布,按钮与状态提示并列放置,收紧控件内边距至 `6x4`/`10x6`。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 表单高度控制在 240 内,布局仍保持清晰。 - ✅ 关键信息一屏可见,交互流程更顺畅。 ### 合并 SSH 表单折叠 - **日期**: 2025年11月11日 - **调整内容**: 1. 将“基础信息”“认证详情”重新合并为单个 `Expander`,内部分 5 行 `Grid` 依次呈现主机/端口/用户名/显示名称、认证方式、密码/口令、私钥路径及操作行。 2. 保留 `MaxHeight=240` 约束,按钮与状态提示继续并排,整体高度紧凑。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 表单信息在同一折叠中连续填写,交互路径更顺滑。 - ✅ 保持原有高度限制与紧凑视觉布局。 ### 优化 SSH 表单列对齐 - **日期**: 2025年11月11日 - **调整内容**: 1. 重新划分首两行网格列宽,使“主机/端口”“用户名/显示名称”分别同行展示,控件宽度统一。 2. 认证行将方式切换、密码与私钥口令合并在同一 `Grid` 中,减少垂直高度并保持对齐。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 表单字段排布整齐、信息不再拥挤。 - ✅ 关键信息在压缩高度下仍能完整显示。 ### SSH 表单卡片双列化 - **日期**: 2025年11月11日 - **调整内容**: 1. 将折叠内部布局重构为两列栅格,左列承载主机/端口与用户名/显示名称,右列展示认证方式,保证左右留白均衡。 2. 密码、私钥口令与私钥路径拆分为独立栈面板,并在底部统一按钮+状态提示排版,整体间距统一为 12~16px。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 表单视觉更加平衡,不再出现某段拥挤某段留白的情况。 - ✅ 字段顺序清晰,所有输入内容均在折叠高度限制内完整可见。 ### SSH 表单统一四列排布 - **日期**: 2025年11月11日 - **调整内容**: 1. 将主机/端口/用户名/显示名称对齐于同一行四列,认证方式、密码、私钥口令、私钥路径也按四列并排显示,整体改为 `StackPanel + Grid` 组合。 2. 減少重复容器,按钮与状态信息保留底部一行,视觉更紧凑、字段一目了然。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 单行即展示全部核心字段,左右留白更均衡。 - ✅ 高度仍控制在 240 之内,信息布局清晰。 ### SSH 表单标签/控件对齐 - **日期**: 2025年11月11日 - **调整内容**: 1. 改为单个 `Grid`,通过 `Auto,*` 成对列定义实现“标签+控件”组合的四列排布,并为间隔列设置固定空间,防止重叠。 2. 私钥路径独占全宽行,按钮与状态信息置于第四行独立 `Grid`,整体间距统一。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 四列布局真正对齐,输入框不再拥挤或重合。 - ✅ 折叠高度依旧受控,字段读取更加直观。 ### SSH 操作栏并入私钥行 - **日期**: 2025年11月11日 - **调整内容**: 1. 将按钮和状态提示移入私钥路径同行,采用三列布局(按钮、间隔、状态)保持横向紧凑。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 操作区与路径配置在同一视觉行,节省垂直空间。 - ✅ 状态消息仍具备充分宽度并随文本自动换行。 ### 阻止连接失败的 SSH 会话出现在列表 - **日期**: 2025年11月11日 - **调整内容**: 1. `SshPageViewModel` 在调用 `StartSessionAsync` 后等待状态首次变为 `Connected/Disconnected/Error`,仅在成功连通后才加入 `_sessions`。 2. 失败或超时直接获取最新错误消息并提示,同时释放临时 ViewModel,避免列表残留。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/SshPageViewModel.cs` - **效果**: - ✅ SSH 连接失败不会再出现在左侧客户端列表,状态提示更准确。 - ✅ 避免短暂失败会话占用资源。 ### SSH 会话增加握手验证 - **日期**: 2025年11月11日 - **调整内容**: 1. `SshPageViewModel` 在检测首个非 Connecting 状态后发送 `echo __aurora_ssh_handshake__`,若 5 秒内未收到响应即判定失败并提示。 2. 成功握手后再等 0.5 秒确认状态稳定,再将会话加入列表。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/SshPageViewModel.cs` - **效果**: - ✅ 即便口令错误或远端拒绝交互,也不会误显示“已连接”。 - ✅ 只有真实可交互的会话会进入客户端列表。 ### 将 known hosts 警告视为普通信息 - **日期**: 2025年11月11日 - **调整内容**: 1. `SshSessionService` 在发布系统消息时识别「Warning: Permanently added … to the list of known hosts」文案,不再标记为错误。 - **涉及文件**: - `AuroraDesk.Infrastructure/Services/SshSessionService.cs` - **效果**: - ✅ 已建立连接时不会把 known hosts 提示渲染成错误消息。 - ✅ 用户仍可从系统消息中看到该提示,并可正常复制。 ### SSH 表单标签/控件对齐 - **日期**: 2025年11月11日 - **调整内容**: 1. 改为单个 `Grid`,通过 `Auto,*` 成对列定义实现“标签+控件”组合的四列排布,并为间隔列设置固定空间,防止重叠。 2. 私钥路径独占全宽行,按钮与状态信息置于第四行独立 `Grid`,整体间距统一。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 四列布局真正对齐,输入框不再拥挤或重合。 - ✅ 折叠高度依旧受控,字段读取更加直观。 ### SSH 操作栏并入私钥行 - **日期**: 2025年11月11日 - **调整内容**: 1. 将按钮和状态提示移入私钥路径同行,采用三列布局(按钮、间隔、状态)保持横向紧凑。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ 操作区与路径配置在同一视觉行,节省垂直空间。 - ✅ 状态消息仍具备充分宽度并随文本自动换行。 ### 修复 SSH 表单栅格闭合 - **日期**: 2025年11月11日 - **调整内容**: 1. 清理折叠内容中残留的 `` 结束标签,避免与新 `StackPanel` 结构冲突导致 XAML 解析失败。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/SshPageView.axaml` - **效果**: - ✅ `dotnet build` 可再次顺利编译。 ### 为 UDP 客户端接收消息列表增加序号显示 - **日期**: 2025年11月11日 - **调整内容**: 1. 将 `UdpClientPageViewModel` 中的 `ReceivedMessages` 升级为包含序号与展示文本的记录类型 `ReceivedMessageEntry`。 2. 接收后台线程为每条消息生成自增序号,清空列表时重置计数,确保序号连续。 3. 调整 `UdpClientPageView.axaml` 接收消息模板,新增带序号徽章的两列布局,提升列表可读性。 - **涉及文件**: - `AuroraDesk.Presentation/ViewModels/Pages/UdpClientPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - **效果**: - ✅ 接收列表左侧清晰显示消息序号,便于定位与沟通。 - ✅ 序号与消息内容一同虚拟化渲染,保持原有性能表现。 ### 优化自动滚动勾选文案 - **日期**: 2025年11月10日 - **调整内容**: - 将接收消息区域复选框文案先更新为“是否滚动条置底”后进一步简化为“自动置底”,保持语义清晰且占用空间更小。 - 将 `UdpClientPageView.axaml.cs` 中对 `DisposeWith` 扩展方法的调用改为显式加入 `CompositeDisposable`,避免扩展方法缺失导致的编译错误。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml.cs` - **效果**: - ✅ 用户可快速理解该选项控制滚动条自动置底的行为,同时避免标题栏拥挤。 - ✅ ReactiveUI 激活生命周期订阅正常释放,`dotnet build` 可以顺利通过。 ### 接收消息列表引入虚拟化以缓解卡顿 - **日期**: 2025年11月10日 - **问题**: 接收消息超过 3000 条后切换 Tab 返回页面会明显卡顿。 - **解决方案**: 1. 将接收消息区域由 `ScrollViewer + ItemsControl` 改为启用虚拟化的 `ListBox`,只生成可视区域内的元素。 2. 更新代码隐藏,将滚动置底逻辑改为基于 `ListBox.ScrollIntoView`,兼容虚拟化场景。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml.cs` - **效果**: - ✅ 切换 Tab 时无需重新构建全部 3000+ 条视觉元素,页面响应显著提升。 - ✅ 自动置底逻辑保持可用,与新的列表控件兼容。 ### 修复附件圆数量变化未刷新画布的问题 - **日期**: 2025年11月6日 - **问题**: 在右侧属性面板调整附件圆数量后,画布上的节点圆点数量不更新。 - **原因**: `Node.ConnectionPoints` 集合增删元素时未触发属性变更通知,导致绑定使用的转换器不会重新计算结果。 - **修复内容**: 1. 为 `Node` 新增构造函数,订阅 `ConnectionPoints.CollectionChanged` 事件。 2. 集合变化时显式调用 `RaisePropertyChanged(nameof(ConnectionPoints))`,确保 UI 绑定重新求值。 3. 在替换 `ConnectionPoints` 集合时正确注销/注册事件,避免内存泄漏。 - **涉及文件**: - `AuroraDesk.Core/Entities/Node.cs` - **效果**: 调整左右附件圆数量后,画布节点立即刷新圆点数量,属性面板与画布保持一致。 ### 调整左右附件圆属性布局为纵向卡片 - **日期**: 2025年11月6日 - **调整内容**: 1. 将左、右侧圆属性卡片改为纵向排列,避免同列并排导致内容拥挤。 2. 每个圆的属性表单重构为与“组件属性”一致的双列表格布局,字段包含序号、直径、颜色、定位。 3. 精简卡片内边距与边框样式,统一视觉层级与留白。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 左右附件圆配置区域上下排列,阅读顺序更自然。 - ✅ 单个圆属性表单与基础属性风格一致,输入焦点和字段对齐更整洁。 ### 为左右附件圆卡片添加折叠交互 - **日期**: 2025年11月6日 - **修改内容**: 1. 使用 `Expander` 包裹左、右侧圆配置区域,提供可折叠的标题栏。 2. 保留原有卡片边框与间距,使内容在展开时维持一致的视觉风格。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 用户可根据需要折叠左右圆配置,保持属性面板简洁。 - ✅ 展开后内容布局与原先保持一致,无额外视觉跳变。 ### 精简附件圆卡片内边距与行距 - **日期**: 2025年11月6日 - **调整内容**: 1. 将左右圆 `Expander` 的内容区 Padding 调整为 6,并取消区块间额外间距。 2. 附件圆列表使用 `StackPanel Spacing="0"`,紧凑呈现多个圆的属性表格。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 属性面板整体占用更少垂直空间,避免上下留白。 - ✅ 多个圆的配置无额外间距,信息密度更高。 ### 将显示位置与数量配置改为表格布局 - **日期**: 2025年11月6日 - **调整内容**: 1. 用带边框的双列表格承载“显示位置”“左侧数量”“右侧数量”三项配置。 2. 统一标签与输入控件的对齐方式,与其他属性表格保持视觉一致。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 显示位置与数量编辑区域风格与其他属性卡片一致。 - ✅ 输入控件列宽固定,阅读与操作更清晰。 ### 移除显示位置选项 - **日期**: 2025年11月6日 - **调整内容**: 1. 删除“显示位置”下拉框,仅保留左右数量配置,由数量是否为零决定显示侧。 2. 表格结构调整为两行(左/右数量),边框与间距同步更新。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 属性面板更精简,避免重复配置。 - ✅ 左右数量保持原有样式,操作习惯不变。 ### 默认附件圆定位改为外侧,并修正偏移 - **日期**: 2025年11月6日 - **修改内容**: 1. 将 `Node`、`NodeTemplate`、`ConnectionPoint` 的默认 `ConnectorPlacementMode` 调整为 `Outside`,并同步更新模板/新增节点逻辑。 2. `ConnectorPlacementMarginConverter` 外侧偏移量调整为直径长度,确保圆点完全位于节点外。 3. `ConnectorColumnPanel` 新增 `Side` 属性,支持根据左右方向贴边排列,并在节点模板中分别指定 `Side="Left"/"Right"`。 - **涉及文件**: - `AuroraDesk.Core/Entities/Node.cs` - `AuroraDesk.Core/Entities/NodeTemplate.cs` - `AuroraDesk.Core/Entities/ConnectionPoint.cs` - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` - `AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs` - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 新增节点与模板默认渲染为外侧圆点,减少手动修改。 - ✅ 选择“外侧”后圆点完全贴在节点外部,视觉符合预期。 ### 附件圆颜色编辑改用 ColorPicker - **日期**: 2025年11月6日 - **修改内容**: 1. 引入 `av:ColorPicker` 替换原有颜色文本框,支持直接选色,禁用 Alpha 频道。 2. 新增 `ColorHexToColorConverter` 实现十六进制字符串与 `Color` 互转,配合 `ColorPicker` 双向绑定。 3. 为 `ColorPicker` 提供统一样式(圆角、边框、高度),保持与其他输入控件一致的视觉风格。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` - **效果**: - ✅ 颜色编辑更直观,避免手动输入 Hex。 - ✅ 色值仍以 `#RRGGBB` 字符串形式写回实体,兼容现有数据结构。 ### 修正 ColorPicker 属性名以适配新版控件 - **日期**: 2025年11月6日 - **修改内容**: 1. 将 `ShowPreview`、`PaletteVisible` 替换为 Avalonia 11 新增的 `IsColorPreviewVisible`、`IsColorPaletteVisible` 属性。 2. 保留 `IsAlphaEnabled="False"` 设置,持续禁用 Alpha 通道输入。 3. 重新启用颜色预览与调色板,便于观察和选择颜色。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 解决构建时 AVLN2000 属性解析错误,ColorPicker 正常渲染。 - ✅ 色彩预览与调色板恢复显示,调整颜色更直观。 ### 确保外侧连接点可见 - **日期**: 2025年11月6日 - **修改内容**: 1. 为节点模板中的根 `Border` 设置 `ClipToBounds="False"`,允许连接点超出节点边界时仍然渲染。 2. 保持现有圆角与阴影效果不变。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 选择“外侧”定位后,左右连接点完整显示在节点外侧。 ### 调整外侧连接点偏移使视觉对齐 - **日期**: 2025年11月6日 - **修改内容**: 1. 将外侧模式下的偏移量由“直径”改为“直径的一半”,使圆点一半在边外、一半在边内。 2. 保持内侧定位逻辑不变。 - **涉及文件**: - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` - **效果**: - ✅ 外侧圆点与内侧视觉保持一致,贴边但不会完全漂出。 ### 修正 ConnectorColumnPanel 右侧排列的外侧偏移 - **日期**: 2025年11月6日 - **修改内容**: 1. 调整 `ConnectorColumnPanel` 中 `Right` 分支的排布公式,允许负 `Margin.Right` 将圆点推到节点外侧。 2. 维持正向 margin 的内缩行为不变。 - **涉及文件**: - `AuroraDesk.Presentation/Controls/ConnectorColumnPanel.cs` - **效果**: - ✅ 右侧外侧圆点将按照设置偏移正确露出外部,视觉与左侧一致。 ### 优化特性面板表格与附件圆横向编辑体验 - **日期**: 2025年11月6日 - **调整内容**: 1. 组件基础属性改为表格式布局,使用带边框的双列表格展示名称、宽度、高度,列宽收紧至 110,信息更集中。 2. 左右附件圆编辑面板改为卡片顶部标题+横向三列(直径/颜色/定位)布局,字段一行内即可填写。 3. 附件圆列表改回纵向 `StackPanel`,每个圆独占一行,卡片随列宽拉伸;保留单卡片分栏布局并统一边距,确保各项独立且排版整洁。 - **涉及文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - **效果**: - ✅ 特性信息以带边框表格呈现,阅读更清晰。 - ✅ 左右附件圆参数可横向填写,减少垂直空间占用。 ### 节点附件圆重构:逐个圆配置半径与定位 - **日期**: 2025年11月6日 - **修改内容**: 1. **核心实体扩展**: 在 `ConnectionPoint` 中新增直径、颜色、定位属性,配合模板初始化默认值,支持每个附件圆独立配置。 2. **数量与模式逻辑**: `NodeCanvasPageViewModel` 将附件圆数量限制调整为 0~4,引入默认数量常量,并基于连接点数量计算显示模式;新增创建连接点的辅助方法,保障新增圆继承默认样式。 3. **数量同步修复**: 新增 `_selectedLeftConnectorCount` / `_selectedRightConnectorCount` 字段及 `RefreshSelectedConnectorCounts()` 辅助方法,确保左右数量下拉选择立刻反映最新连接点数量,切换模式后不再固定为 3 个。 4. **属性面板重构**: 右侧面板改为“组件属性”“附件圆属性”双卡片,基础属性采用表格布局,附件圆属性以垂直卡片形式呈现(移除表格式排版),支持逐个圆的直径、颜色、定位编辑。 5. **画布渲染更新**: 节点模板左右侧的 `ItemsControl` 直接使用连接点自身的直径与定位数据,外侧/内侧偏移基于单个圆计算。 6. **辅助转换器**: 新增 `IndexToDisplayTextConverter` 用于在界面上以「圆 1/圆 2」方式展示序号。 - **涉及文件**: - `AuroraDesk.Core/Entities/ConnectionPoint.cs` - `AuroraDesk.Core/Entities/NodeTemplate.cs` - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` - **效果**: - ✅ 左右两侧附件圆完全独立设置数量、半径、颜色与内外侧定位。 - ✅ 新增连接点自动采用侧边默认样式,减少重复输入。 - ✅ 属性面板交互更直观,每个圆的设置清晰可见。 ### 重构画布属性面板聚焦节点基础属性 - **日期**: 2025年11月6日 - **修改内容**: 1. **属性面板布局**: 重新组织 `NodeCanvasPageView` 右侧属性面板,保留节点名称与宽高编辑项,调整排版与间距,使信息层级更清晰。 2. **附件圆模式**: 新增 `ConnectorAttachmentMode` 枚举并在 ViewModel 中提供 `SelectedConnectorMode`、`SelectedNodeHasLeftConnector` 等属性,通过下拉框控制附件圆的显示位置(无/仅左/仅右/两侧),并自动隐藏无效直径输入框。 3. **状态提示**: 当未选中节点时展示提示卡片,已选中节点时显示 “已选中对象” 状态文字,便于理解当前编辑上下文。 - **修改文件**: - `AuroraDesk.Core/Entities/ConnectorAttachmentMode.cs` - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` ### 优化节点多连接点显示与文本换行能力 - **日期**: 2025年11月6日 - **调整内容**: 1. **多连接点支持**: 为节点数据模板引入左右 `ItemsControl`,通过转换器动态过滤输入/输出连接点,默认为每侧生成至少3个连接点,满足复杂组件需求。 2. **连接点样式**: 左右圆点紧贴节点边框、默认直径设置为3,批量使用节点颜色配置;左侧圆点不再留出额外内边距。 3. **文本换行**: 将节点中心内容改为堆叠布局,标题与正文均支持自动换行,提升长文本展示效果。 - **修改文件**: - `AuroraDesk.Core/Entities/Node.cs` - `AuroraDesk.Core/Entities/NodeTemplate.cs` - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` ### 组件库重构:提供竖向/横向矩形模板 - **日期**: 2025年11月6日 - **需求**: 组件库只需提供两个基础组件——竖向矩形与横向矩形 - **实现内容**: 1. **节点模板**: - 清空并重建 `NodeTemplates`,新增 `rectangle-vertical` 与 `rectangle-horizontal` - 设置宽高比:竖向 (80×160)、横向 (180×80) - 取消默认输入/输出连接点,`Content` 为空 2. **画布节点展示**: - 简化画布中的节点模板,直接根据宽高绘制矩形并显示标题 - 节点选中时仍沿用边框高亮、粗细转换器 3. **组件库预览**: - 重构左侧模板展示 UI,通过 `Viewbox` 按比例缩放矩形预览 - 显示名称、描述以及宽/高信息,便于快速辨识 4. **属性面板编辑能力**: - 可直接编辑标题、正文文字 - 宽度/高度支持即时数字输入(双向绑定) - 左右附件圆支持调整直径与颜色 5. **新增节点命令**: - `AddNode` 默认创建横向矩形,移除旧的连接点初始化逻辑 - **修改文件**: - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` ### 优化 NodeCanvasPageView 属性面板与节点尺寸约束 - **日期**: 2025年11月6日 - **优化内容**: 1. **属性面板视觉清晰度**: - 在 `NodeCanvasPageView.axaml` 顶层启用 `UseLayoutRounding`,并为属性面板容器设置局部 `Styles`(强制使用微软雅黑字体、统一内边距与圆角),缓解 Windows 下输入框及标签发虚问题 - ScrollViewer、Border、StackPanel 同步启用 `UseLayoutRounding`,细化布局像素对齐 2. **全局字体一致性**: - 在 `App.axaml` 中为 `TextBlock`/`TextBox` 设置默认字体族为 `Microsoft YaHei` 优先,保障中文界面清晰可读 3. **节点尺寸与附件圆限制**: - 在 `Node` 实体中为宽度/高度及左右附件圆直径增加 `Math.Clamp` 约束,防止输入异常数值导致渲染异常 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - `AuroraDesk/App.axaml` - `AuroraDesk.Core/Entities/Node.cs` ### 代码优化:清理 NodeCanvasPageView 和移除默认测试节点 - **日期**: 2025年11月6日 - **修改内容**: 1. **移除默认测试节点**: - 删除 `InitializeTestNode()` 方法及其调用 - 清理构造函数中的调试输出 2. **代码优化**: - 移除 `NodeCanvasPageView.axaml.cs` 中大量调试输出(`System.Diagnostics.Debug.WriteLine`) - 简化 `OnTemplateButtonDoubleTapped` 方法 - 优化 `UpdateNodePositions` 和 `UpdateSingleNodePosition` 方法,移除冗余日志 - 简化异常处理,使用空 catch 块(位置更新主要依赖数据绑定) - 清理 `UpdateNodesOnCanvas` 方法(已不再使用) 3. **代码结构**: - 保持核心功能不变 - 代码更简洁易读 - 保留必要的注释和文档 - **技术改进**: - 位置更新主要依赖 XAML 数据绑定(`Canvas.Left="{Binding X}"` 和 `Canvas.Top="{Binding Y}"`) - 代码后台的位置更新作为备用方案保留 - 移除了调试阶段的临时代码 - **修改文件**: - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - 移除测试节点初始化 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 代码优化和清理 ### 修复节点在画布上不显示的问题 - **日期**: 2025年11月6日 - **问题**: `InitializeTestNode` 执行后节点已添加到服务,位置也设置成功,但画布上不显示节点 - **原因分析**: - 在 Avalonia 中,当使用 `ItemsControl` 和 `Canvas` 作为 `ItemsPanel` 时,需要在 `ItemTemplate` 的根元素上绑定 `Canvas.Left` 和 `Canvas.Top` 属性 - 之前的代码只有代码后台手动设置位置,但缺少 XAML 绑定,导致节点位置无法正确设置 - **关键问题**:`ItemsControl` 使用的 `Canvas`(作为 `ItemsPanel`)大小为 0x0,导致节点虽然位置正确但不可见 - **修复内容**: 1. **XAML 绑定位置**: - 在 `ItemTemplate` 的 `Border` 元素上添加 `Canvas.Left="{Binding X}"` 和 `Canvas.Top="{Binding Y}"` 绑定 2. **Canvas 大小设置**: - 在 `ItemsPanelTemplate` 的 `Canvas` 上设置 `Width="2000"`、`Height="2000"`、`MinWidth="2000"`、`MinHeight="2000"` - 确保 Canvas 有明确的大小,与 `CanvasContainer` 保持一致 3. **ItemsControl 布局**: - 为 `ItemsControl` 添加 `HorizontalAlignment="Stretch"` 和 `VerticalAlignment="Stretch"` 4. **调试信息增强**: - 添加更详细的调试日志,包括: - ItemsControl 的直接视觉子元素数量 - Canvas 面板的大小和子元素数量 - 每个子元素的位置、可见性和大小 - 节点容器的可见性状态 - **技术细节**: - 在 Avalonia 中,`ItemsControl` 使用 `Canvas` 作为 `ItemsPanel` 时: - 位置绑定应该在 `ItemTemplate` 的根元素上 - Canvas 必须设置明确的大小(不能依赖自动计算) - 数据绑定会自动处理位置更新,代码后台的手动设置作为备用方案保留 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 添加 Canvas.Left/Top 绑定,设置 Canvas 大小,添加 ItemsControl 对齐属性 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 添加更详细的调试信息 ### 修复 SelectedNode 绑定 null 值错误 - **日期**: 2025年11月6日 - **问题**: 当 `SelectedNode` 为 null 时,绑定到 `SelectedNode.Title`、`SelectedNode.X`、`SelectedNode.Y`、`SelectedNode.Width`、`SelectedNode.Height` 的属性会出现绑定错误 - **错误日志**: ``` [Binding]An error occurred binding 'Text' to 'SelectedNode.Title' at 'SelectedNode': 'Value is null.' [Binding]An error occurred binding 'Text' to 'SelectedNode.X' at 'SelectedNode': 'Value is null.' [Binding]An error occurred binding 'Text' to 'SelectedNode.Y' at 'SelectedNode': 'Value is null.' [Binding]An error occurred binding 'Text' to 'SelectedNode.Width' at 'SelectedNode': 'Value is null.' [Binding]An error occurred binding 'Text' to 'SelectedNode.Height' at 'SelectedNode': 'Value is null.' ``` - **修复内容**: - 为所有 `SelectedNode.Property` 绑定添加 `TargetNullValue` 和 `FallbackValue` 属性 - `SelectedNode.Title` 绑定:添加 `TargetNullValue=''` 和 `FallbackValue=''` - `SelectedNode.X`、`SelectedNode.Y`、`SelectedNode.Width`、`SelectedNode.Height` 绑定:添加 `TargetNullValue='0.00'` 和 `FallbackValue='0.00'` - **技术细节**: - `TargetNullValue`: 当绑定的值为 null 时使用的默认值 - `FallbackValue`: 当绑定失败时使用的默认值 - 字符串属性使用空字符串作为默认值 - 数值属性使用 '0.00' 作为默认值(与 StringFormat 的格式保持一致) - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 修复所有 SelectedNode 属性绑定,添加 null 值处理 ### 修复节点添加后画布不显示问题 - **日期**: 2025年11月6日 - **问题**: 从日志看节点已成功添加到服务,但画布上不显示节点 - **原因分析**: - `WhenAnyValue(x => x.Nodes)` 只监听属性引用变化,不会响应 `ObservableCollection` 的内容变化 - 需要直接监听集合的 `CollectionChanged` 事件来确保 UI 更新 - Avalonia 的 `ItemsControl` 不支持 `ItemContainerStyle` 属性(与 WPF 不同) - **修复内容**: 1. **View Code-Behind (`NodeCanvasPageView.axaml.cs`)**: - 使用 `WhenAnyValue(x => x.Nodes)` 监听属性变化,并在订阅中直接订阅 `CollectionChanged` 事件 - 当集合变化时,强制刷新 `ItemsControl` 的布局(调用 `InvalidateMeasure()` 和 `InvalidateArrange()`) - 添加了详细的调试日志,方便追踪节点添加过程 2. **View XAML (`NodeCanvasPageView.axaml`)**: - 在 `ItemTemplate` 中使用 `ContentControl` 包装 `Border`,并在 `ContentControl` 上设置 `Canvas.Left` 和 `Canvas.Top` 绑定 - 这是 Avalonia 中设置 Canvas 位置的正确方式(因为 Avalonia 不支持 `ItemContainerStyle`) 3. **简化代码**: - 简化了 `UpdateNodesOnCanvas` 方法,移除了手动设置位置的代码(现在由数据绑定自动处理) - **技术细节**: - `ObservableCollection` 实现了 `INotifyCollectionChanged` 接口,可以直接订阅 `CollectionChanged` 事件 - 在 Avalonia 中,当使用 `ItemsControl` 与 `Canvas` 作为 `ItemsPanel` 时,需要在 `ItemTemplate` 中的控件上直接设置 `Canvas.Left` 和 `Canvas.Top` 附加属性 - 使用 `Dispatcher.UIThread.Post` 确保 UI 更新在 UI 线程上执行 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 添加集合变化监听和强制刷新逻辑 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 修复 Canvas 位置绑定方式(使用 ContentControl 包装) ### 修复双击组件添加功能,改用PointerPressed检测双击 - **日期**: 2025年11月6日 - **问题**: XAML中的DoubleTapped事件在DataTemplate中无法正确触发 - **修复内容**: - 移除了XAML中的`DoubleTapped="OnTemplateItemDoubleTapped"`绑定 - 改用`PointerPressed`事件手动检测双击(通过时间间隔判断) - 添加了双击检测相关字段:`_lastTemplateClickTime`、`_lastTemplateClickBorder`、`DoubleClickDelayMs`(500ms) - 实现了`OnTemplateItemPointerPressed`方法来检测双击 - 将双击处理逻辑提取到`HandleTemplateDoubleClick`方法中 - 添加了详细的日志输出,方便追踪双击事件和节点添加过程 - **技术细节**: - 双击检测:同一个Border在500ms内连续点击两次即判定为双击 - 使用`DateTime.Now`记录点击时间 - 使用延迟任务自动清除超时的点击记录 - 保持了原有的位置计算逻辑(考虑缩放和平移) - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 移除DoubleTapped绑定 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 改用PointerPressed检测双击 ### 清理拖拽逻辑并添加双击添加组件功能 - **日期**: 2025年1月10日 - **修改内容**: 清理不生效的拖拽逻辑,改为双击组件库中的组件即可添加到画布 - **清理内容**: - 移除了 `SetupTemplateDragAndDrop()` 方法 - 移除了 `SetupTemplateItems()` 方法 - 移除了 `SetupTemplateItemDrag()` 方法 - 移除了 `OnCanvasDragOver()` 方法 - 移除了 `OnCanvasDrop()` 方法 - 移除了 Canvas 和 ScrollViewer 上的拖拽事件绑定 - **新增功能**: - 添加了 `SetupTemplateDoubleClick()` 方法 - 添加了 `SetupTemplateItemsDoubleClick()` 方法 - 添加了 `SetupTemplateItemDoubleClick()` 方法 - 双击组件库中的组件时,会在画布中心位置添加节点 - 如果画布还没有尺寸,使用默认位置 (200, 200) - **用户体验**: - 双击组件即可快速添加到画布,操作更简单 - 节点默认添加到画布中心,便于查看和编辑 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 清理拖拽逻辑,添加双击功能 ### 优化 NodeCanvasPageView 缩放控件使用 HeroIcons 图标 - **日期**: 2025年1月10日 - **修改内容**: 将缩放控件的文本符号(+、−、重置)替换为 HeroIcons.Avalonia 图标,提升视觉效果 - **实现方式**: - 添加 HeroIcons 命名空间引用:`xmlns:heroicons="clr-namespace:HeroIconsAvalonia.Controls;assembly=HeroIconsAvalonia"` - 缩小按钮:使用 `HeroIcon Type="Minus"` 图标(16x16像素) - 放大按钮:使用 `HeroIcon Type="Plus"` 图标(16x16像素) - 重置按钮:使用 `HeroIcon Type="ArrowsPointingOut"` 图标配合文字"重置"(14x14像素) - **视觉效果**: - 图标使用统一的文本主色(TextPrimary) - 图标居中对齐,大小适中 - 按钮间距调整为6px,整体更紧凑 - 重置按钮使用图标+文字的组合方式,更直观 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 使用 HeroIcons 替换文本符号 ### 为 NodeCanvasPageView 中间画布添加拖动和缩放功能 - **日期**: 2025年1月10日 - **修改内容**: 为节点编辑器页面的中间画布添加拖动(平移)功能,与缩放功能配合使用 - **实现方式**: - **XAML层面**: - 使用 `TransformGroup` 组合 `TranslateTransform` 和 `ScaleTransform` - 平移和缩放都绑定到 ViewModel 的 `CanvasOffsetX`、`CanvasOffsetY` 和 `CanvasZoom` 属性 - 先应用平移,再应用缩放,确保正确的变换顺序 - **代码后台**: - 添加画布拖动状态跟踪:`_isDraggingCanvas`、`_canvasDragStartPoint`、`_canvasDragStartOffsetX`、`_canvasDragStartOffsetY` - 支持两种拖动方式: - 鼠标中键拖动 - 空格键+鼠标左键拖动 - 在 `OnCanvasPointerPressed`、`OnCanvasPointerMoved`、`OnCanvasPointerReleased` 中处理画布拖动 - 在 `OnScrollViewerPointerPressed`、`OnScrollViewerPointerMoved`、`OnScrollViewerPointerReleased` 中处理 ScrollViewer 上的拖动 - 添加键盘事件处理(`OnKeyDown`、`OnKeyUp`)来检测空格键状态 - 拖动时考虑缩放因子,确保拖动距离正确 - 拖动时改变光标为手型(Hand) - **交互功能**: - 鼠标中键拖动:按住鼠标中键拖动即可平移画布 - 空格键+左键拖动:按住空格键,然后按住鼠标左键拖动即可平移画布 - 拖动时光标变为手型,松开后恢复 - 拖动距离会根据当前缩放比例自动调整 - **技术细节**: - 拖动偏移量计算:`deltaX / zoomFactor` 和 `deltaY / zoomFactor` - 确保节点拖动和画布拖动不会冲突 - 拖动时更新 ViewModel 的 `CanvasOffsetX` 和 `CanvasOffsetY` 属性 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 添加 TransformGroup 支持平移和缩放 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 添加画布拖动逻辑 ### 为 NodeCanvasPageView 中间画布添加缩放功能 - **日期**: 2025年1月10日 - **修改内容**: 为节点编辑器页面的中间画布添加缩放功能,支持按钮缩放和鼠标滚轮缩放 - **实现方式**: - **ViewModel层面**: - 添加缩放命令:ZoomInCommand(放大)、ZoomOutCommand(缩小)、ResetZoomCommand(重置缩放)、SetZoomCommand(设置缩放) - 缩放范围限制在0.1倍到3.0倍之间 - 每次缩放步进为1.2倍(放大)或1/1.2倍(缩小) - **View层面**: - 为CanvasContainer和GridBackgroundLayer添加ScaleTransform,绑定到ViewModel的CanvasZoom属性 - 在画布右上角添加缩放控件,包含:缩小按钮(−)、缩放比例显示、放大按钮(+)、重置按钮 - 缩放控件使用白色背景、圆角边框,悬浮在画布上方(ZIndex=100) - **交互功能**: - 支持鼠标滚轮缩放:按住Ctrl键并滚动鼠标滚轮进行缩放 - 向上滚动放大,向下滚动缩小 - **视觉效果**: - 缩放控件显示当前缩放比例(百分比格式) - 缩放时画布内容和网格背景同步缩放 - 缩放控件始终显示在画布右上角,不影响画布内容 - **修改文件**: - `AuroraDesk.Presentation/ViewModels/Pages/NodeCanvasPageViewModel.cs` - 添加缩放命令和逻辑 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 添加缩放控件和Transform - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 添加鼠标滚轮缩放支持 ### 为 NodeCanvasPageView 三列添加类似 GroupBox 效果 - **日期**: 2025年1月10日 - **修改内容**: 为节点编辑器页面的三列(左侧组件库、中间画布、右侧属性面板)添加类似GroupBox的边框效果 - **实现方式**: - 保持3列Grid布局不变,为最外层Grid添加Margin="12"来创建整体边距 - 左侧Border:添加完整边框(BorderThickness="1")、圆角(CornerRadius="8")、右边距(Margin="0,0,12,0") - 中间画布:用Border包裹Grid,添加完整边框(BorderThickness="1")、圆角(CornerRadius="8")、右边距(Margin="0,0,12,0") - 右侧Border:添加完整边框(BorderThickness="1")、圆角(CornerRadius="8") - 所有边框使用BorderLight颜色(#E0E0E0),背景使用白色或浅灰色 - **视觉效果**: - 三列现在都有完整的圆角边框,类似GroupBox效果 - 列与列之间有12px的间距,视觉上更加清晰分离 - 所有边框使用统一的浅灰色(BorderLight),与整体设计风格一致 - 圆角半径为8px,提供现代化的视觉效果 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 为三列添加GroupBox样式的边框和间距 ### 修复 NodeCanvasPageView 中的编译错误 - **日期**: 2025年1月10日 - **问题**: - `ItemContainerGenerator` 未包含 `ContainerFromItem` 的定义 - `DispatcherPriority` 未包含 `Layout` 的定义 - **修复内容**: 1. 移除了不存在的 `ItemContainerGenerator.ContainerFromItem()` 方法调用 2. 改用 `GetVisualDescendants()` 方法遍历视觉树来查找对应的 `ContentControl` 容器 3. 将 `DispatcherPriority.Layout` 改为 `DispatcherPriority.Normal`(Avalonia 中不存在 Layout 枚举值) - **技术说明**: - 在 Avalonia 中,`ItemContainerGenerator` 没有 `ContainerFromItem` 方法 - 通过遍历视觉树(`GetVisualDescendants()`)来查找对应的容器是更可靠的方法 - `DispatcherPriority` 枚举在 Avalonia 中可用的值包括:`Invalid`, `Inactive`, `SystemIdle`, `ApplicationIdle`, `ContextIdle`, `Background`, `Input`, `Loaded`, `Render`, `Normal`, `Send` - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml.cs` - 修复容器查找方法和 DispatcherPriority 枚举值 ### 调整 UdpServerPageView 客户端列表折叠按钮位置到左侧 - **日期**: 2025年1月10日 - **修改内容**: 将客户端列表的折叠按钮从标题栏中间移到最左侧,使用三列 Grid 布局 - **布局改进**: - 使用 `Grid` 三列布局:`ColumnDefinitions="Auto,*,Auto"` - 第一列:折叠按钮(左侧,固定宽度 40px,左侧内边距 16px) - 第二列:标题内容(中间,自适应宽度,包含图标、文字和徽章) - 第三列:清空按钮(右侧,固定宽度) - **视觉效果**: 折叠按钮现在独立显示在左侧,布局更加清晰,符合常见的折叠面板设计模式 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml` - 调整折叠按钮布局位置 ### 优化 UdpServerPageView 布局,使客户端列表和接收消息区域铺满剩余空间 - **日期**: 2025年1月10日 - **修改内容**: 为客户端列表和接收消息区域的 Border、Grid、Expander 和 ScrollViewer 添加 `VerticalAlignment="Stretch"` 属性,使它们能够铺满剩余的垂直空间 - **改进点**: - 客户端列表 Border 添加了 `VerticalAlignment="Stretch"` - 客户端列表内部 Grid 添加了 `VerticalAlignment="Stretch"` - 客户端列表 Expander 添加了 `VerticalAlignment="Stretch"` - 客户端列表 ScrollViewer 添加了 `VerticalAlignment="Stretch"` - 接收消息区域 Border 添加了 `VerticalAlignment="Stretch"` - 接收消息区域内部 Grid 添加了 `VerticalAlignment="Stretch"` - 接收消息区域 ScrollViewer 添加了 `VerticalAlignment="Stretch"` - **效果**: 两个区域现在能够充分利用可用的垂直空间,提供更好的用户体验 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml` - 添加垂直对齐属性 ### 修复 UdpServerPageView 中 Border 控件无效属性错误 - **日期**: 2025年1月10日 - **问题**: Border 控件不支持 `HorizontalContentAlignment` 属性,导致编译错误 AVLN2000 - **修复内容**: 移除了第 285 行 Border 控件上的无效属性 `HorizontalContentAlignment="Stretch"` - **说明**: - `Border` 控件在 Avalonia 中不支持 `HorizontalContentAlignment` 属性 - 使用 `HorizontalAlignment="Stretch"` 即可实现 Border 本身的对齐 - 内容对齐可以通过内部容器(如 Grid)的 `HorizontalAlignment` 属性控制 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml` - 移除无效属性 ### 重构 UdpServerPageView 布局为两行结构并支持折叠 - **日期**: 2025年1月10日 - **修改内容**: 重构 UDP 服务端页面视图为两行布局,客户端列表支持折叠功能 - **布局结构**: - 第一行:服务器控制(监听端口、启动/停止按钮,横向排列) - 第二行:左右分栏布局 - 左边(1/3):客户端列表区域(使用 Expander 支持折叠,显示连接的客户端信息) - 右边(2/3):接收消息区域(显示接收到的消息列表) - **改进点**: - 配置区域改为横向布局,端口输入和启动/停止按钮在同一行 - 客户端列表和接收消息区域采用左右分栏,右边接收消息区域占据 2/3 宽度 - 客户端列表使用 Expander 控件,支持折叠/展开功能 - 所有 Border 和 Expander 添加了 HorizontalAlignment="Stretch" 确保占满宽度 - 保持了原有的功能和样式风格 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml` - 重构为两行布局,客户端列表支持折叠 ### 重构 UdpClientPageView 布局为两行结构 - **日期**: 2025年1月10日 - **修改内容**: 重构 UDP 客户端页面视图,将主要内容区域改为两行布局 - **布局结构**: - 第一行:连接配置(IP、端口、本地端口、连接/断开按钮,横向排列) - 第二行:左右分栏布局 - 左边(1/3):已发送消息区域(包含消息列表和输入框) - 右边(2/3):接收消息区域(显示接收到的消息列表) - **改进点**: - 配置区域保持横向布局,所有配置项和按钮在同一行 - 已发送消息和接收消息区域采用左右分栏,右边接收消息区域占据 2/3 宽度 - 已发送消息区域整合了消息列表和输入框,布局更紧凑 - 保持了原有的功能和样式风格 - **修改文件**: - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - 重构为两行布局,左右分栏 ### 实现 UDP 客户端和服务端功能 - **日期**: 2025年1月10日 - **修改内容**: 实现 UDP 客户端和服务端两个视图页面,并添加到导航菜单中 - **功能实现**: - ✅ 创建 UDP 客户端 ViewModel (`UdpClientPageViewModel.cs`) - ✅ 创建 UDP 服务端 ViewModel (`UdpServerPageViewModel.cs`) - ✅ 创建 UDP 客户端 View (`UdpClientPageView.axaml` 和 `.axaml.cs`) - ✅ 创建 UDP 服务端 View (`UdpServerPageView.axaml` 和 `.axaml.cs`) - ✅ 在 PageViewModelFactory 中注册两个页面 - ✅ 在 ServiceCollectionExtensions 中注册 ViewModel - ✅ 在 NavigationService 中添加导航项(UDP 工具分组) - **UDP 客户端功能**: - 配置服务器 IP 和端口 - 连接/断开服务器 - 发送消息到服务器 - 接收服务器响应 - 显示已发送和接收的消息列表 - 清空消息列表 - **UDP 服务端功能**: - 配置监听端口 - 启动/停止监听 - 接收客户端消息 - 自动回复客户端(可选) - 显示接收到的消息列表 - 显示连接的客户端列表(IP:端口、消息数、首次/最后连接时间) - 清空消息和客户端列表 - **修改文件**: - `AuroraDesk.Presentation/ViewModels/Pages/UdpClientPageViewModel.cs` - UDP 客户端 ViewModel - `AuroraDesk.Presentation/ViewModels/Pages/UdpServerPageViewModel.cs` - UDP 服务端 ViewModel - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml` - UDP 客户端视图 - `AuroraDesk.Presentation/Views/Pages/UdpClientPageView.axaml.cs` - UDP 客户端视图代码 - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml` - UDP 服务端视图 - `AuroraDesk.Presentation/Views/Pages/UdpServerPageView.axaml.cs` - UDP 服务端视图代码 - `AuroraDesk.Presentation/Services/PageViewModelFactory.cs` - 注册页面工厂方法 - `AuroraDesk.Presentation/Extensions/ServiceCollectionExtensions.cs` - 注册 ViewModel 服务 - `AuroraDesk.Infrastructure/Services/NavigationService.cs` - 添加导航项 - **技术实现**: - 遵循 ReactiveUI + MVVM 模式 - 使用 ReactiveCommand 实现命令绑定 - 使用 ObservableCollection 管理消息列表 - 异步网络操作(UDP 发送/接收) - 后台任务处理消息接收(避免阻塞 UI) - 资源清理(Dispose 模式) - 使用 Dispatcher.UIThread 确保 UI 线程安全更新 - **架构遵循**: - ✅ 整洁架构(Clean Architecture) - ✅ ReactiveUI 响应式编程模式 - ✅ MVVM 模式 - ✅ 依赖注入(DI) - ✅ 服务层分离(ViewModel 只处理业务逻辑,View 只负责 UI 展示) - **导航结构**: - UDP 工具(父级导航项,IconType.Signal) - UDP 客户端(IconType.ArrowRight) - UDP 服务端 (IconType.Server) - **UI 特性**: - 现代化的界面设计(圆角、阴影、颜色区分) - 实时状态显示 - 消息时间戳 - 客户端信息详细展示 - 响应式布局 - **测试建议**: - 启动 UDP 服务端,监听端口 8080 - 启动 UDP 客户端,连接到 127.0.0.1:8080 - 发送测试消息,验证双向通信 - 测试多客户端连接场景 - 测试异常情况(端口占用、网络错误等) ### 修正节点附件圆外侧定位,确保左侧圆在边线左侧 - **日期**: 2025年11月7日 - **问题**: 左侧附件圆设置为 Outside 模式时,圆没有正确显示在组件左边线的左侧,而是显示在右侧;修正后圆圈像是被容器裁剪遮挡 - **修复内容**: 1. **转换器逻辑重构**: - 重构 `ConnectorPlacementMarginConverter` 转换器逻辑,明确区分 Inside 和 Outside 模式 - Outside 模式: - 左侧圆使用负的左边距(`Thickness(-size, 0, 0, 0)`),向左偏移一个直径的距离 - 右侧圆使用负的右边距(`Thickness(0, 0, -size, 0)`),向右偏移一个直径的距离 - Inside 模式:不添加额外边距(`Thickness(0)`) - 添加详细的代码注释,说明 Outside 和 Inside 模式的含义 2. **禁用容器裁剪**: - 为节点内部的 `Grid` 容器添加 `ClipToBounds="False"`,确保外侧圆不被裁剪 - 为左右两侧的 `ItemsControl` 添加 `ClipToBounds="False"` - 为左右两侧的 `ConnectorColumnPanel` 添加 `ClipToBounds="False"` - 确保圆圈完全显示在节点外侧,不会被任何容器裁剪 - **涉及文件**: - `AuroraDesk.Presentation/Converters/NodeCanvasConverters.cs` - 修正 ConnectorPlacementMarginConverter 逻辑 - `AuroraDesk.Presentation/Views/Pages/NodeCanvasPageView.axaml` - 添加 ClipToBounds="False" 禁用容器裁剪 - **效果**: - ✅ 左侧外侧圆正确显示在组件左边线的左侧,完全可见不被裁剪 - ✅ 右侧外侧圆正确显示在组件右边线的右侧,完全可见不被裁剪 - ✅ 内侧模式保持圆在组件边界内部 - ✅ 代码逻辑更加清晰易懂 ### 修复清除画布时无法清除连接的问题 - **日期**: 2025年11月7日 - **问题**: 清除画布时,如果画布上有连接线(Connection),无法正确清除 - **原因**: `NodeCanvasService.Clear()` 方法只是简单地清空了连接集合,但没有重置连接点(ConnectionPoint)的 `IsConnected` 状态 - **修复内容**: - 在 `Clear()` 方法中,先遍历所有连接,重置源连接点和目标连接点的 `IsConnected` 状态为 `false` - 然后再清空连接集合和节点集合 - 这与 `RemoveConnection()` 方法的处理逻辑保持一致 - **涉及文件**: - `AuroraDesk.Infrastructure/Services/NodeCanvasService.cs` - 修正 Clear() 方法 - **效果**: - ✅ 清除画布时,所有连接点的状态被正确重置 - ✅ 清除后可以正常添加新的节点和连接 - ✅ 避免了连接点状态不一致导致的问题