原生架构

WinUI 外壳、Rust Native Host 与共享 Web 视图的边界。

本页描述 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 版本说明。

继续阅读宿主通信与状态或构建与本地运行。