运行模式
同一个页面可以在三个地方运行,运行的地方决定了它能控制多少窗口。
| 模式 | 页面出现在哪里 | 它能控制什么 |
|---|---|---|
| 独立窗口 | Webview2 UI 是 Default User Interface,页面就是整个 foobar2000 窗口 | 窗口本身:尺寸、标题栏、背景效果、托盘图标、任务栏按钮 |
| DUI 面板 | Default UI 布局里的一个 WebView2 Panel 元素 | 只有自己那一块区域 |
| CUI 面板 | Columns UI 布局里的一个 WebView2 Panel | 只有自己那一块区域 |
后台模式还提供第四种安排:在 Default UI 或 Columns UI 旁边单独运行一个 WebView2 UI 窗口。
不变的部分
每种模式运行的都是同样的页面,用同样的 bridge。播放、播放列表、媒体库、封面、元数据、配置以及其他 foobar2000 命名空间在哪里都能用,fb.* 方法和 fb-* 组件也不需要知道自己在哪里运行。所以一个主题可以用一套代码同时服务窗口和面板。
面板里有什么不同
面板是另一个界面所属窗口里的一块子区域,所以它不能操作那个窗口:
- 改变窗口的
window.*方法(尺寸、位置、最小化与最大化、全屏、标题栏与拖动区域、Mica、亚克力等背景效果、圆角样式、置顶)由面板调用时以PANEL_MODE_UNSUPPORTED失败。 - WebView2 UI 不是主界面时,
tray.*与taskbar.*也以同样的方式失败,因为没有 WebView2 UI 窗口来拥有托盘图标或任务栏按钮。 - 每个面板有自己的配置:可以加载自己的模板或 URL,也有自己的透明、焦点、拖放和开发者工具开关。
页面用 window.getMode 查询自己在哪里运行;怎样让页面适应面板,见把页面放进面板。
为什么有三种模式
接管整个界面能让主题完全掌控窗口,但很多人想保留 Default UI 或 Columns UI 的播放列表和媒体库视图,只让窗口的一部分是网页:封面与歌词区、可视化、正在播放条。面板服务的就是这种需求,主题不必重新实现 foobar2000 界面的其余部分。