原生架构
本页描述 2026-09-22 的 WinUI 迁移实现。Tauri 仓库保留的 Vue 主应用、WinUI 原生外壳和网站 Web 播放器是不同入口。
三层职责
| 层 | 位置 | 职责 |
|---|---|---|
| Windows 外壳 | src-winui/OFPlayer.WinUI | XAML 导航、曲库列表与网格、设置、对话框、系统媒体会话 |
| C# 核心与通信 | src-winui/OFPlayer.WinUI.Core | 宿主协议、stdio 传输、状态归并、输出设备和业务策略 |
| Rust Native Host | src-tauri/src/native_host.rs、native_session.rs | 曲库与数据库、导入扫描、播放队列、解码输出、远端资源和设备接力 |
沉浸视图和歌词胶囊复用 Vue Web 视图,由 WebView2 承载。它们从宿主接收播放状态,不是另一个拥有独立队列的播放器。
导航与内容
左上角 SourcePickerView 选择本地曲库或远端连接,MainWindow 组织侧栏。LibraryPageView 承载本地曲目、远端内容和分组网格。
数据层级保持 曲库 → 歌单 → 曲目。最近导入、收藏、队列等是智能视图。专辑与艺术家来自元数据分组;艺术家下钻专辑时,宿主查询保留艺术家过滤条件,避免同名专辑混入其他人的曲目。
MainViewModel 的 Catalog、Management、Playback、Remote、Hub 等部分协调界面和宿主调用。新增功能时先确定哪个模块拥有状态,不在 XAML 事件中另建播放权威。
播放与界面更新
用户操作经 C# 客户端请求 Native Host,由同一个原生会话管理队列与播放。宿主事件更新主播放栏、系统媒体会话,以及沉浸和胶囊。
进度、电平允许合并,关键状态事件需要保留。胶囊电平来自实际音频引擎;封面通过 WebView2 的受控资源路径提供,不能把任意本地路径直接当作网页 URL。
数据与预览
NativeHostService 默认为 WinUI 使用独立预览数据目录,也支持显式配置。数据库由宿主持有跨进程独占锁;网页 IndexedDB 与它不是同一份数据。
桌面 stdio 通道本身不需要监听网络端口。开启手机接力后运行的局域网服务属于另一项明确启用的能力,不能因此声称整个应用永不访问网络。
尚需保留的边界
Web 主题 token 不直接控制原生 XAML 外观;原生和 Web 歌词并非所有效果都已一致。更新检查、许可显示模型也不能替代实际安装或完整业务限制。当前状态见Windows 版本说明。