如果你的信息来源仅限于互联网,你可能会觉得,Windows 桌面开发已经彻底完蛋了,但根据 Visual Studio 中的遥测数据,每个月有大约 240 万开发人员在积极地开发桌面应用程序,比 20 个月前增长了 50%。有一个如此大的社区支持,微软正在寻找方法,帮助开发人员把那些资产整合进 Windows 10。
XAML Islands
关于微软的 Windows 开发,其中一个最大的抱怨是微软在 Winforms 和 WPF 上投入少;Windows 10 提供的大部分新特性都只是针对 UWP 构建的。虽然我们现在可以从.NET Framework 调用 UWP API,但仅适用于不涉及 UI 的情况。
为了解决这个问题,微软创建了两个新控件:WinForms XAML Host 和 WPF XAML Host,使开发人员可以把为UWP 编写的UI 嵌入到现有的WinForms/WPF 应用程序。
UWP 封装和 Windows 7 回退
开发人员之所以继续使用 WinForms 或 WPF,其中一个原因是为了支持 Windows 7。后来,人们需要新推出的 XAML Islands,这是因为它使得应用程序不在 Windows 10 上也可以正常运行。
其中一个例子是现在已经可以使用的 WebView。如果应用程序在 Windows 10 上运行,那么 WebView 就是 Edge 浏览器的宿主。如果是运行在 Windows 7 上,那么它就会加载 IE 浏览器控件。
其他控件还处于规划阶段,包括 MediaPlayer、InkCanvas/InkToolBar、Map 和 SwapChainPanel。
空域
把 WinForms 和 WPF 混合使用的开发人员都熟悉“空域(airspace)”的概念,它是用于处理在同一个窗口中来自不同 UI 框架的控件相互重叠的问题。
在 Win32 开发中,屏幕上的每个对象自己都有一个在 OS 层面注册的窗口句柄(HWND)。HWND 关联着屏幕上的一个矩形,对象可以在其中渲染其内容。一般来说,每个 WinForms 控件都会获得自己的 HWND,而大多数 WPF 控件都共享整个窗口的 HWND。
对于 XAML Islands(WinForms 和 WPF),HWND 创建后供 UWP 控件使用。这会带来一些不明显的影响。例如,如果你旋转 UWP 控件,HWND 不会随之旋转,也就是说,HWND 需要更大一些才能为它提供空间。
弹出式上下文菜单尤其难以处理。它们通常有自己的 HWND,但是,该 HWND 不一定能够和 XAML 的 HWND 正确堆叠,导致菜单看上去在另一个控件后面。
线程模型
目前在 UWP 中,每个顶级窗口预计都有自己专有的 UI 线程。例如说,你有一个主 - 从视图,从视图是用 UWP 编写的。你可以通过以下几种方式实现:
- 从视图共享主视图的窗口:没问题。
- 从视图有自己的顶级窗口,不共享对象:没问题。
- 从视图有自己的顶级窗口,但和主视图共享对象:可能会有竞态条件、UI 跨线程问题等。
最终,这个问题将通过引入轻量级窗口来解决。
查看英文原文: Modernizing Windows Desktop Applications with XAML Islands
评论