Repository navigation
feat(avalonia): 从 WPF 迁移到 Avalonia UI 并提供多系统支持 [DeepSeek-V4.1-flash] - #3798
Draft
Chiloven945 wants to merge 27 commits into
Draft
Chiloven945 wants to merge 27 commits into
Chiloven945 wants to merge 27 commits into
Conversation
- 新建 PCL.Launcher.Avalonia(Avalonia 12.1.4 / net10.0)与 PCL.Core.Avalonia 适配层, 实现 7 个平台服务与 IApplicationHost/IWindowHost/IUiModalFrame,接入 PCL.Core 生命周期 - 主窗口、页面路由与加载页,可冷启动到主窗口;复用 metadata.json 嵌入资源 - PCL.Core 与 PCL.Launcher.Core 降为 net10.0,WPF 工程保持 net10.0-windows - 业务层去 WPF 化:pack:// 走 IResourceStore 抽象,Watcher 窗口操作走 IWindowInterop - 修复 Linux 启动即崩的 Windows 专有静态初始化 - 启动链支持 linux/macos:classpath/PATH 分隔符、库规则与 natives 分类器、Java 可执行名与扫描器
新增 Avalonia 平台服务接缝与桌面实现:
- 系统代理:ISystemProxyProvider,Linux 读取 http_proxy/https_proxy/all_proxy 与 GNOME gsettings
- 深色模式:ISystemThemeProvider,经由 Avalonia PlatformSettings.GetColorValues()
- 系统通知:ISystemNotificationService,经 freedesktop org.freedesktop.Notifications(GNOME/KDE Plasma)发送,通知服务不可用时才退回应用内浮层
- Avalonia 头工程打包启动链资源(辅助 jar、log4j2 配置、mcmod.buf、OAuth 页面),AvaloniaResourceStore 支持清单资源读取
消除 Linux 平台功能回退:
- 硬件信息:/proc/cpuinfo、/proc/meminfo、/sys/class/drm 读取 CPU/内存/GPU
- 设备指纹:/etc/machine-id 与 DMI 信息替代 WMI
- 遥测与启动日志:物理内存、管理员身份改用跨平台等价实现
- 命名管道:SO_PEERCRED 取对端 PID 并做同用户校验(提权进程 root 放行)
- 区域信号:LANG/LC_ALL/LANGUAGE 与系统时区
- LegacyFix:非 Windows 恢复启用 Java agent
- GPU 偏好与渲染器:游戏进程注入 DRI_PRIME/NVIDIA PRIME 与 Mesa 环境变量
- 提权:pkexec 实现 StartAsAdmin 与 PromoteService 管道流程
- 进程信息:/proc/{pid}/cmdline、geteuid 判断管理员
- 启动脚本导出改为 .sh;快捷方式使用 XDG .desktop
其它:
- 为 Windows 专用 API 补齐 SupportedOSPlatform 标注,消除 CA1416
- 修复 Rider lint 发现的线程安全与冗余代码问题(字典快照、冗余抑制、未用变量/参数等)
Windows 行为保持逐字符不变:所有平台分支均为非 Windows 路径新增,Windows 原代码未改动。
本地化:
- 7 种语言资源由 WPF ResourceDictionary 忠实迁移为 Avalonia 资源字典(仅命名空间差异,注释完整保留)
- AvaloniaLocalizationBackend 改为 ResourceInclude 合并应用资源,基础语言先加载、当前语言覆盖、缺失回退
- 新增 LocExtension({loc:Loc Key})支持语言热切换;修复致命对话框按钮文本本地化
Avalonia 界面层:
- 窗口效果降级链(Mica/AcrylicBlur/Blur/Transparent/None)与动画速度映射、页面淡入
- 页面基础设施:PageBase/IPageView、PageRegistry、PageRouter 按 key 导航、PageStyles 样式
- 迁移首批页面:SpeedRight、LogLeft、SelectLeft、DownloadClient、HelpDetail
- 补全 PCL.Launcher.Core 的 16 类业务 UI seam 的 Avalonia 实现(内存/区域/打码为真实逻辑,其余最小实现并标注 TODO)
工程与质量:
- PCL.Platform 拆分 S0/S1:IDialogService 改名 IFatalDialogService、WPF 专用包归位、校验器迁入 PCL.Core
- 已知降级/回退点补 // TODO: 标注
命名普通化(方案 A): - PCL.Core.Avalonia → PCL.Core.UI,PCL.Launcher.Avalonia → PCL.Launcher - 15 个平台服务类与 18 个 seam 实现类去掉 Avalonia 前缀,命名空间、XAML x:Class、avares URI、slnx 路径同步更新 - 头工程 AssemblyName 定为 PCL.Launcher,避免 Linux 下可执行文件名 PCL 与默认数据目录 PCL/ 冲突 审计修复: - RC-01:补齐 IWindowInterop(Windows user32 + Linux X11)并注册 11/11,新增平台服务启动校验 - AR-01/AR-02:平台服务与 18 项业务 seam 的启动期缺失校验 - RC-02:页面画刷改为 Light/Dark ThemeDictionaries,新增 WindowSurface 半透明承托,窗口材质不再被整页不透明背景遮挡 - RC-03:内存初始值与 WPF 语义对齐(LockMemory/自定义 Xms/MemorySolution 分支) - RC-04:日志打码补上当前登录 AccessToken 规则,Launcher.Core 暴露只读 CurrentLogin - RC-05:更新后重启改用正式 API Lifecycle.RequestRestartOnExit - RC-06:IUiDispatcher.Post 在 UI 线程也排队,不再同步重入 - OA-06/OA-09/ST-03:ResourceStore 清单前缀显式化、CurrentLevel 降为 private、Animations 目录/命名空间一致 验证:完整 slnx(Debug/x64)构建 0 error;未运行 UI。
- IThemeBackend 拆分 SetColorResource / SetBrushResource,去掉 WPF 的 asBrush 参数 - ILocalizationBackend 去掉 ApplyLaunchFont,字体应用移到 Avalonia 后端,由 LanguageChanged 事件触发 - seam 强类型化:ShowCompDetail(Comp.CompProject)、ModpackUi(McInstallRequest/LoaderBase)、ProfileUi(GameLaunch.McLoginData?) - 保留 LocExtension/LocalizationTextSource/IPageView:WPF 参考实现仍在使用,不得按当前 Avalonia 用量删除 验证:PCL.Launcher(Debug/x64)构建通过。
- 7 个语言资源字典从 PCL.Core.UI 迁入 PCL.Localization(EmbeddedResource),保留原 XAML 结构与注释 - 新增 LocalizationCatalog:枚举语言、读取键与键值,不依赖 Avalonia/WPF,供测试与 i18n 工具使用 - PCL.Core.UI 以 AvaloniaResource + Link 链接同一批文件,avares://PCL.Core.UI/Localization/Languages/*.axaml 路径保持不变 - PCL.Localization 暂不进入构建入口;slnx 修复后加入 验证:PCL.Localization 构建通过;PCL.Core.UI.dll 内资源路径已确认。
- 删除 PCL.Core.Wpf.csproj 与 Plain Craft Launcher 2.csproj;WPF 源码保留为只读迁移参考,不再参与构建 - Plain Craft Launcher 2.slnx:移除两个已删 WPF 工程条目、加入 PCL.Localization、暂时移出不可构建的 PCL.Core.Test(TW-1 后加回) - 保留 slnx 作为 IDE 与多工程构建入口 验证:dotnet build "Plain Craft Launcher 2.slnx"(Debug/x64)通过。
- 迁移 SvgIcon、控件族、对话框、提示、样式、资源与字体到 Avalonia - 移植动画引擎与 PCL.Animations 过程式 API - 修复审计发现的注释、功能回退与 WPF 重复源码
…flash] - 采用 MsgBoxWrapper 到 DialogService 的迁移 - DependencyCheckService 保留 Linux 平台守卫,改用异步弹窗结果 - LogService 保留跨平台致命错误弹窗,不引入 WPF MessageBox - 接受 WPF 搜索别名改动(参考源码,不参与构建)
- 对齐窗口壳、页面转场、提示/弹窗、字体、主题键与全局控件模板\n- 恢复窗口缩放/居中/闪屏、平台内存探测与本地化/资源完整性\n- 删除实例占位页、下载禁用卡、联机死卡与假默认值\n- 移除 SeamStub/UiSeamValidation/SeamBusinessActions 并回接现有页面实现
- 接入 NavigationService、RouteKey 与 ViewModelBase 测试 - 对齐设置、下载、实例、启动/登录、二级页/工具页面结构 - 修复窗口阴影/模糊、卡片圆角、按钮高度、ComboBox 宽度与 MyLoading 主题色 - 补齐 metadata.json 运行期依赖许可
- 删除 SeamHosts、ISeam*、SeamCapabilities 与 SeamContracts - 页面级调用改为页面 Current、PageRouter 与普通页面契约 - UiSeamInteraction/UiSeamPassive/Crash 移出 Seams 并重命名 - CompLocalUpdateRegistry 下沉到 Launcher.Core - IMediaService 增加 IsAvailable,媒体 UI 改为服务能力判断
- 下载/实例/启动登录/二级页与工具页迁移 47 个 ViewModel\n- 保留 PageDownloadInstall、PageInstanceInstall、PageToolsGameLink 到 Phase 3 对应后端\n- 更新页面绑定与视图职责,构建和测试保持通过
- 实例页:完成整体、设置、安装、存档、截图、服务器、导出等页面的 XAML + ViewModel 迁移,修复资源空状态、Mod 禁用页、服务器卡片与存档详情布局 - 下载页:重做资源搜索、详情、收藏与安装流程,补齐加载器选择、安装卡片、分页、筛选和页面转场 - 工具页:迁移测试与联机逻辑,接入 EasyTier 安装、平台探测、CLI 和联机链路,补齐 Wi-Fi/信号图标 - 核心:重构安装管线、加载器特殊安装、实例 JSON 合并、安装恢复与 McInstallRequest 校验,完善 GameFolders、文件操作和日志级别控制 - 基础设施:完善生命周期与未处理异常流程,新增跨平台原生致命错误对话框、运行时 XAML 渲染与安全校验、媒体播放服务与 MiniAudio 后端 - UI:修复 MyListItem、MyPageRight、ComboBox/TextBox/Slider/RadioBox、菜单、Tooltip、字体选择与页面空状态等回归 - 清理:移除旧 Jar-in-Jar 占位页,统一到 MyLocalModItem;更新本地化、解决方案与资源 - 测试:新增/更新 EasyTier、GameFolders、FatalDialog、XamlSecurity 及现有回归测试
- Linux:默认使用 X11/XWayland,Wayland 改为可选启动(PCL_USE_WAYLAND=1 或调试设置); 设置页新增显示协议选项及逐项 Tooltip;补充 Wayland app_id、XDG desktop entry、 icon.png,并关闭 region dirty rect clipping 规避掉帧。 - 跨平台集成:Java 选择器按平台使用 java/java.exe;Linux 增加 kdialog/zenity 文件对话框回退;系统主题与代理改为 KDE/GNOME/macOS 事件驱动;通知与 Linux 任务栏进度改为后台执行。 - macOS:新增 .app 打包脚本、Info.plist、icon.icns、原生菜单与快捷键、 Finder alias/.command 快捷方式。 - 更新:Windows 保留应用内更新;macOS/Linux 仅检测更新并打开下载页。 - 性能:移除逐帧动画日志,改为聚合 fps/最大帧间隔统计;MyImage 按目标尺寸 解码;新闻、截图、日志等列表补充虚拟化或离屏回收;新增布局探针与调试窗口 尺寸入口。 - 可访问性:自定义按钮与选择控件补充 Enter/Space、AutomationPeer/Name、 右键/长按入口。 - 结构:PCL.Core/IO/Files.cs 按职责拆分为 Files.Shortcut、Files.Archive、 Files.Async、Files.Json、Files.Hash partial 文件。 - 发布:新增 scripts/publish.sh、verify-artifact.sh、package-macos.sh; 发布产物清理 PDB,并校验原生库隔离。 验证:PCL.Launcher Debug 构建 0 error。 备注:Windows/macOS/GNOME 实机验证仍为 PENDING-HARDWARE。
- 新增 PlatformKind、PlatformRuntime、PlatformModule、PlatformCapabilities, 由 PlatformModuleFactory 统一组装平台服务 - 按平台拆分文件对话框、通知、系统主题、系统代理、快捷方式、回收站、 Java parser/scanner、Shell、系统信息、进程清理、GPU 偏好、区域信号、 任务栏进度、窗口交互与启动流程 - 删除平台空壳、纯转发包装类和重复的 Posix/Windows 实现, 合并 capabilities 与 platform module - 将 PCL.Core/IO/Files.cs 拆分为多个 partial 文件 - 用 PlatformKind 替换 EasyTierHostOs - 保留 Linux X11/Wayland 选择、Wayland desktop entry 图标修复 - 降低 X11 窗口轮询频率,限制日志刷屏,并增加 _NET_WM_PID 缺失时的窗口类名/标题回退匹配 - 非 Debug 构建移除动画帧诊断日志 - 更新现有测试引用以适配新平台 API 验证: - Plain Craft Launcher 2.slnx Debug x64 构建 0 error - Beta 构建 0 error,产物不包含动画帧诊断字符串 - 未运行测试、未启动 GUI
* fix: native classifiers * fix: native classifiers (x2)
- PageSelectRight 在 PageOnEnter 前初始化加载器,失败或中止后重新进入 会自动重试;修正 StopReloadTimer 状态未复位的问题 - PageSelectLeft 每次导航同步文件夹与选中项,仅在列表或选中项变化时 重载实例列表,避免重复启动加载器 - 实例扫描改为局部构建成功后原子替换,空缓存或无效缓存会重新扫描, force refresh 时清理 InstanceCache,避免失败或取消污染现有列表 - 修正下载安装、整合包安装后重载实例时重复拼接 versions 的路径 - 补充所有实例被隐藏时的空态文案,更新 zh-CN、zh-TW、en-US、en-GB - MyListItem 高光层改为构造时创建并由 :pointerover 样式兜底,修正 行尾按钮命中、Color 主题、25px 间距和 ToolTip 定位,对齐 WPF - 最新版本卡通过 StackInstall 补齐底部留白 - 文件夹右键菜单使用 NoScroll,避免窗口高度不足时出现滚动条 close: #1
- 资源页支持子目录资源加载、全目录搜索、筛选计数与固定操作列 - 补齐资源启停、更新、删除、安装校验与更新注册表保护 - 数据包页迁移到 LocalCompFile 和 MyLocalModItem,保留批量更新与拖放安装 - 新增共享多选条与滑动选择,支持滑回自动恢复 - 优化存档、截图、服务器页的状态、错误处理与刷新行为 - 服务器行改为 44px 资源列表风格,修复 MotD 十六进制颜色解析与长文本溢出 - 修复实例资源拖放目标、LabyMod 路径和多 zip 处理 - 新增资源搜索、路径粘贴测试并更新迁移文档
- 同步 PCL.Core 弹窗选项 SvgIcon 字段,选择弹窗列表项恢复图标 - Avalonia DialogPresenter 在连续弹窗间保留遮罩,避免闪白 - 功能隐藏设置改为分组标题 + WrapPanel 自适应布局 - 存档图标增加 6px 圆角,主页 CE 提示补充上间距 - 下载卡片底部留白与 includePcl 命名已在 Avalonia 侧对齐,不做重复修改 - WPF 工程保持删除状态,上游 WPF 改动仅作为语义参考迁移到 Avalonia
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
变更说明 / Summary
先开着(
关联 Issue / Related Issue
close #3029
验证方式 / Verification
dotnet buildAI 使用情况 / Generative Artificial Intelligence Usage
提交前检查 / Checklist