本文主要介绍一类 Windows 桌面媒体客户端在 UI 路线上的演进:何时用 WebView2 复用主 Web 前端换速度,为何一度把 WinUI 3 写成长期正式方向,以及如何在「两条都重要」时明确当前产品主线,避免文档与开发默认值互相打架。

以 Octans Windows 客户端为例。播放侧早已收敛到受控 LGPL libmpv;真正反复折腾的是管理 UI 用什么壳,以及播放期 OSD 能不能叠在 native 视频上。下面按时间线写清决策关系,不把支线写成已上线事实。

问题域

Windows 客户端通常要同时满足:

能力要求
内容消费海报墙、详情、播放
库管理高密度列表、批处理、设置
播放native 硬解 / 字幕 / 会话与服务端对齐
形态键鼠桌面;可选 TV / HTPC 遥控

可选架构并不只有「全原生」或「全 Web」:

A. Host + WebView2 加载主 Web UI + native playback
B. 全原生 UI(如 WinUI 3)+ API client + native playback
C. 混合:管理 UI 一套,播放 chrome / OSD 另一套

约束往往来自:重复造业务前端的成本WebView 与 video HWND 的 airspace / z-orderTV 焦点模型,以及团队能否同时维护两条壳。

阶段一:WebView2 复用主 Web UI(历史)

决策要点

  • Desktop 正式 UI 复用已有 Web 前端(路由、鉴权、墙、详情、控制台、设计体系)。
  • Windows Host 负责窗口、bridge、日志 / 配置 / 崩溃、native playback、可信 Server origin 加载。
  • Host 内嵌的「迷你桌面页」只做 bridge / 认证 / 播放 POC,扩展成第二套业务前端。

为什么当时合理

主 Web 已有完整管理面与播放页。若在桌面仓再手写墙 / 表 / 弹层,会复制路由、API orchestration、权限与视觉体系,长期成本高于在 Web 侧补 desktop runtime profile 与 Host adapter。

边界(仍值得记住)

  • API / Hub 保持同源相对路径;Desktop 直接加载服务端 Web origin,而不是 Host 自带整包 dist。
  • 播放接管应发生在播放页 / playback 适配层,不要散落到每个列表页。
  • TV / HTPC 不能简单放大桌面管理页;表格、右键、dense toolbar 不是 10-foot 交互。

该路线后来被标为 superseded(被下一阶段文档替代),但作为「最快拿到桌面管理能力」的历史选择仍然成立。

阶段二:WinUI 3 作为长期正式方向(仍有效的候选)

决策要点

长期目标形态写成:

WinUI 3 原生应用
  + 自有设计语言的原生组件库
  + API / 实时客户端
  + LibMpvBackend + 受控 LGPL runtime
  + gpu-next + d3d11 + d3d11va 播放 baseline

不再把「主 WebView2 shell + 整站 Web UI 复用」当作长期 Desktop 主线。Web 继续服务浏览器,并作为能力对照;Windows 共享设计语言、API 与播放契约,不共享页面实现。

为什么要动

目标Web 复用的压力
稳定透明悬浮 OSD / 标题栏WebView 与 video 层 z-order、命中测试、全屏 / DPI 反复修补
TV / 遥控桌面 Web 信息架构牵制焦点与返回栈
原生一致性Host bridge 成为长期核心协议,复杂度外溢到每个页面

明确拒绝的长期主线

  1. 继续 WebView2 + 主 Web 整站复用作长期主线:短期最快,长期保留多层焦点与输入仲裁。
  2. Web 主 UI + native 播放 + 透明 Web OSD作长期主线:OSD 合成不能牺牲播放 baseline;且不等于「管理 UI 也应全 Web」。
  3. 以旧 WPF 业务 UI 为目标框架:既已决定重写业务面,直接面向 WinUI 3 更清晰。

窄范围例外(重要)

拒绝「Web 当主 UI shell」,不等于否定:

原生主应用 + mpv child HWND + 仅播放期的 OSD-only WebView2 / DComp overlay

实测里,同窗口简单叠 XAML OSD 可能出现「OSD 可见视频黑 / 视频可见 OSD 被盖」一类 airspace 问题;独立透明 overlay 路径可在 HDR 样片上验证透出、点击、resize 与退出。这类结论只能服务播放 chrome,不能扩大成 Desktop 管理 UI 复用。

代价

完整管理能力需原生重写;表格虚拟化、弹层、表单 primitives 的迁移量不能低估。若目标只是最快 TV MVP,Web 壳仍是现实捷径;若目标是长期 Windows 产品体验,原生上限更高。

阶段三:明确当前产品主线(运营决策)

长期候选与日常开发 / 发布默认必须拆开。

当前产品主线(以 2026-07 口径):

main
  + WebView2 / WPF Host
  + Server Web origin 主业务 UI
  + Host bridge / DComp OSD overlay
  + LibMpvBackend + 受控 LGPL runtime
  + portable 发布
维度结论
产品 / 发布主线main + WebView2 Host
日常开发默认main
WinUI 3支线 / 长期候选,不是当前发布主线
文档默认按 WebView2 写「当前实现」;WinUI 写「候选 / 计划」

WinUI 3 决策不撤销,但不得写成「main 已全面原生落地」。若未来把 WinUI 升为产品主线,应新开决策并改写上表。

演进关系一览

WebView2 复用主 Web(历史主线,已 superseded 为「长期方向」)
WinUI 3 长期正式方向(候选仍 active)
运营拍板:当前发布主线仍是 WebView2 main
        └── WinUI 支线暂停或按需恢复,不得与 main 写成等价主线

公开表述建议:

  • 现在用户装到的:WebView2 Host + 服务端 Web UI + native 播放 + 播放期 overlay。
  • 长期仍在评估的:WinUI 3 全原生管理 UI。
  • 始终分开的:浏览器 Web ≠ Windows 壳;播放 OSD ≠ 整站 UI。

对同类产品的启示

  1. 「复用 Web」解决的是管理面速度,不是 TV 与 OSD 免费。TV 仍要独立壳与焦点。
  2. 长期原生与短期 Web 壳可以并存,但必须写清哪条是发布默认,否则 Agent、文档、CI 会各写各的。
  3. 播放合成问题单独验收,不要用管理 UI 路线绑架 gpu-next / 硬解 baseline。
  4. supersede 要写演进,不要留两份互相打架的「当前真理」。
  5. LGPL runtime、source offer、可替换链接等边界与 UI 壳无关,换壳时不得回退合规。

注意事项

  • 本文是路线与边界说明,不是安装手册,也不承诺 WinUI 交付日期。
  • 内部分支名、spike 名仅作演进锚点;对外以「当前主线 / 长期候选」表述即可。
  • 具体播放排障见同系列播放文;前端组件库选型见 Web UI 基座文。

相关阅读

来源

本文综合改写自 Octans 项目 Windows Desktop Web UI 复用决策、WinUI 3 原生 UI 决策,以及 WebView2 产品主线决策。已标注 supersede / 运营主线关系;实现路径已脱敏。