Skip to content

feat(avalonia): 从 WPF 迁移到 Avalonia UI 并提供多系统支持 [DeepSeek-V4.1-flash] - #3798

Draft
Chiloven945 wants to merge 27 commits into
devfrom
dev
Draft

Chiloven945 wants to merge 27 commits into
devfrom
dev

Conversation

@Chiloven945

Copy link
Copy Markdown
Member

变更说明 / Summary

先开着(

关联 Issue / Related Issue

close #3029

验证方式 / Verification

dotnet build

AI 使用情况 / Generative Artificial Intelligence Usage

  • 使用情况 / Usage:实质性使用
  • 使用工具及模型 / Tools and models:DeepSeek-V4.1-flash
  • 使用目的 / Purpose:迁移
  • 涉及范围 / Scope:全部
  • 人工审查与验证 / Human review and verification:已人工逐行浏览审查并修改

提交前检查 / Checklist

  • 我已阅读并遵守 技术规范 和 生成式人工智能使用方针。/ I have read and followed the Technical Guidelines and the Generative Artificial Intelligence Usage Policy.
  • 我能解释本次修改的全部内容,包括关键逻辑、异常处理和已知限制。/ I can explain all changes, including key logic, error handling, and known limitations.
  • 我确认未伪造日志、测试结果、基准数据或其他证据。/ I confirm that no logs, test results, benchmarks, or other evidence have been fabricated.
  • 本次提交不包含与修改无关的文件变更,也未提交临时文件或构建产物。/ The PR contains no unrelated changes, temporary files, or build artifacts.
  • 所有提交均已签名,且提交信息符合提交信息规范。/ All commits are signed and follow the commit message convention.
  • 我确认 PR 描述由本人撰写,未直接提交未经核实的 AI 生成内容。/ I confirm that I wrote this PR description myself and have not submitted unverified AI-generated content.

Chiloven945 and others added 20 commits November 1, 2026 17:41
- 新建 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
@Chiloven945 Chiloven945 self-assigned this Nov 7, 2026
@pcl-ce-automation pcl-ce-automation Bot added 🚧 正在处理 开发人员正在对该内容进行开发、测试或修复,进展中 size: XXL PR 大小评估:巨型 labels Nov 7, 2026
sourcery-ai[bot]

This comment was marked as abuse.

EncVar and others added 6 commits November 8, 2026 13:01
* 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size: XXL PR 大小评估:巨型 🚧 正在处理 开发人员正在对该内容进行开发、测试或修复,进展中

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Avalonia] 前端框架迁移规划

2 participants