UWP 应用中 CoreApplication / Application, CoreWindow / Window 之间的区别

在 StackOverflow 上看到有小伙伴询问 CoreApplication, CoreApplicationView, Application, ApplicationView, CoreWindow, Window 它们的含义以及它们之间的区别。

于是我整理了这篇文章。


This post is written in multiple languages. Please select yours:

StackOverflow 上的地址:c# - CoreApplicationView vs CoreWindow vs ApplicationView - Stack Overflow

命名空间

类的完整含义经常需要配合其命名空间查看,所以我们有必要将这几个类的完整名称拿出来看:

额外的,如果你关心标题栏,还有:

再额外的,如果你关心线程模型,还有:

可以看到,大的命名空间分类有 Windows.ApplicationModelWindows.UI 两类。也就是说,CoreApplicationCoreApplicationView 是管理应用程序模型的,而 ApplicationCoreWindowWindow 是管理应用内 UI 的。小的命名空间分类有 CoreXaml 两类。也就是说,CoreApplicationCoreApplicationViewCoreWindow 是管理核心功能,而 ApplicationWindow 是管理 XAML UI 的。

自顶向下

ApplicationWindow 到 XAML 内容,很明显地就能直到其是自顶向下的关系,应用内包含窗口,窗口内包含 XAML 内容。那么它们之间的关系呢?

CoreApplication 管理一个 UWP 应用中的所有视图(View),而 CoreApplication 直接管理的视图是 CoreApplicationView;也就是说,UWP 应用 CoreApplication 管理所有的应用视图 CoreApplicationView。而一个 CoreApplicationView 包含一个窗口和一个线程调度模型,即 CoreWindowCoreDispatcher

UWP 应用视图
▲ UWP 应用视图

让 UWP 应用显示多个窗口(多视图) 一文中,由于一个应用对应多个视图,所以可以更容易地理解它们之间的关系。

CoreWindow 就是我们所理解的窗口。为了方便使用,Windows.UI.XAML.Window 类型封装了这个 CoreWindowCoreDispatcher 是基于消息循环的线程调度模型,正是因为有了消息循环,所以此窗口才能一直显示而不被销毁。

对外,还是对内?

我们是站在 UWP 普通开发者的角度来思考这个问题的,普通 UWP 开发者是从 MainPage 开始写 UWP 应用的。所以在这里,“外” 指的是页面之外,或者叫做我们直接编写的 XAML 内容之外,那些非 XAML 内容;而 “内” 指的是页面之内,也就是我们通常写的 XAML 内容。

对外的部分有 CoreApplicationCoreApplicationViewCoreWindow,对内的部分有 ApplicationWindow。其中,Window 是对 CoreWindow 的封装,提供了更多与 XAML 相关的功能。这里的 ApplicationView 也是这样,是对 CoreApplication 的封装,提供了 XAML 相关的功能。

具体来说,CoreWindow 是与操作系统、与整个应用打交道的类型,提供了诸如窗口的尺寸、位置、输入状态等设置或调用;Window 是与应用内 UI 打交道的类型,比如可以设置窗口内显示的 UI,设置内部哪个控件属于标题栏,获取此窗口内的 Compositor。与之对应的,CoreApplicationView 是应用与操作系统交互,与窗口消息循环机制协同工作的类型,包含窗口客户区和非客户区设置;ApplicationView 也是与应用内 UI 打交道的类型,它可以使用 XAML 相关的类型对应用程序视图进行更方便的设置。

总结起来,CoreWindowCoreApplicationView 提供更加核心的操作系统或应用底层功能,而 WindowApplicationView 对前者进行了封装,使得我们能够使用 Windows.UI.Xaml 命名空间下的类型对窗口和应用视图进行控制。

关于这些概念的更多应用

我有另外一些文章用到了这些概念:


参考资料

本文会经常更新,请阅读原文: https://walterlv.github.io/post/core-application-window-of-uwp.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系