在 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.ApplicationModel.Core.CoreApplicationWindows.ApplicationModel.Core.CoreApplicationViewWindows.UI.Xaml.ApplicationWindows.UI.ViewManagement.ApplicationViewWindows.UI.Core.CoreWindowWindows.UI.Xaml.Window
额外的,如果你关心标题栏,还有:
Windows.ApplicationModel.Core.CoreApplicationViewTitleBarWindows.UI.ViewManagement.ApplicationViewTitleBar
再额外的,如果你关心线程模型,还有:
Windows.UI.Core.CoreDispatcherWindows.UI.Xaml.DispatcherTimer
可以看到,大的命名空间分类有 Windows.ApplicationModel 和 Windows.UI 两类。也就是说,CoreApplication 和 CoreApplicationView 是管理应用程序模型的,而 Application、CoreWindow 和 Window 是管理应用内 UI 的。小的命名空间分类有 Core 和 Xaml 两类。也就是说,CoreApplication、CoreApplicationView 和 CoreWindow 是管理核心功能,而 Application 和 Window 是管理 XAML UI 的。
自顶向下
Application 到 Window 到 XAML 内容,很明显地就能直到其是自顶向下的关系,应用内包含窗口,窗口内包含 XAML 内容。那么它们之间的关系呢?
CoreApplication 管理一个 UWP 应用中的所有视图(View),而 CoreApplication 直接管理的视图是 CoreApplicationView;也就是说,UWP 应用 CoreApplication 管理所有的应用视图 CoreApplicationView。而一个 CoreApplicationView 包含一个窗口和一个线程调度模型,即 CoreWindow 和 CoreDispatcher。

▲ UWP 应用视图
在 让 UWP 应用显示多个窗口(多视图) 一文中,由于一个应用对应多个视图,所以可以更容易地理解它们之间的关系。
CoreWindow 就是我们所理解的窗口。为了方便使用,Windows.UI.XAML.Window 类型封装了这个 CoreWindow。CoreDispatcher 是基于消息循环的线程调度模型,正是因为有了消息循环,所以此窗口才能一直显示而不被销毁。
对外,还是对内?
我们是站在 UWP 普通开发者的角度来思考这个问题的,普通 UWP 开发者是从 MainPage 开始写 UWP 应用的。所以在这里,“外” 指的是页面之外,或者叫做我们直接编写的 XAML 内容之外,那些非 XAML 内容;而 “内” 指的是页面之内,也就是我们通常写的 XAML 内容。
对外的部分有 CoreApplication、CoreApplicationView 和 CoreWindow,对内的部分有 Application 和 Window。其中,Window 是对 CoreWindow 的封装,提供了更多与 XAML 相关的功能。这里的 ApplicationView 也是这样,是对 CoreApplication 的封装,提供了 XAML 相关的功能。
具体来说,CoreWindow 是与操作系统、与整个应用打交道的类型,提供了诸如窗口的尺寸、位置、输入状态等设置或调用;Window 是与应用内 UI 打交道的类型,比如可以设置窗口内显示的 UI,设置内部哪个控件属于标题栏,获取此窗口内的 Compositor。与之对应的,CoreApplicationView 是应用与操作系统交互,与窗口消息循环机制协同工作的类型,包含窗口客户区和非客户区设置;ApplicationView 也是与应用内 UI 打交道的类型,它可以使用 XAML 相关的类型对应用程序视图进行更方便的设置。
总结起来,CoreWindow 和 CoreApplicationView 提供更加核心的操作系统或应用底层功能,而 Window 和 ApplicationView 对前者进行了封装,使得我们能够使用 Windows.UI.Xaml 命名空间下的类型对窗口和应用视图进行控制。
关于这些概念的更多应用
我有另外一些文章用到了这些概念:
参考资料
本文会经常更新,请阅读原文: https://blog.walterlv.com/post/core-application-window-of-uwp.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://blog.walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 ([email protected]) 。