您提到的课程之间存在一些差异。我们可以通过两个维度来区分它们:
- 结构(参见从上到下部分)
- 函数(参见For external or for inner部分)
我专门为这个问题写了一篇帖子,见http://walterlv.github.io/post/core-application-window-of-uwp-en.html。
有时我们必须查看带有命名空间的完整类名来确定它们的含义。
Windows.ApplicationModel.Core.CoreApplication
Windows.ApplicationModel.Core.CoreApplicationView
Windows.UI.Xaml.Application
Windows.UI.Core.CoreWindow
Windows.UI.Xaml.Window
额外,如果您对标题栏感兴趣,
Windows.ApplicationModel.Core.CoreApplicationViewTitleBar
Windows.UI.ViewManagement.ApplicationViewTitleBar
另外,如果您对线程模型感兴趣,
Windows.UI.Core.CoreDispatcher
Windows.UI.Xaml.DispatcherTimer
我们可以将它们拆分为Windows.ApplicationModel和Windows.UI,或者将它们拆分为Core和Xaml。
CoreApplication 和 CoreApplicationView 管理应用程序模型,Application、CoreWindow 和 Window 管理应用程序内部 UI。 CoreApplication、CoreApplicationView 和 CoreWindow 管理核心功能,但 Application 和 Window 管理 XAML UI。
从上到下
从上到下是从Application 到Window,然后到XAML。很明显,应用程序包含窗口,而窗口包含内部 XAML UI。那么,真正的关系是什么?
CoreApplication 管理 UWP 应用程序的所有视图,CoreApplicationView 是它直接管理的视图。 CoreApplicationView 包含一个 CoreWindow 作为窗口和一个 CoreDispatcher 作为线程模型。
▲ UWP 应用视图
您可以阅读Show multiple views for an app - UWP app developer - Microsoft Docs 了解如何编写多视图应用程序。你会更了解CoreApplication和CoreApplicationView之间的关系。
CoreWindow 是我们都熟悉的窗口。
Windows.UI.XAML.Window 封装CoreWindow 以便于使用。 CoreDispatcher是基于windows消息循环的线程模型。是CoreDispatcher 使窗口一直显示而不会被释放。
外用还是内用
大部分 UWP 开发者都是普通的开发者,所以我们应该站在他们一边考虑外在和内在。普通UWP开发者从MainPage开始写代码,所以外层是页面外,内层是页面的XAML内容。
外部包含CoreApplication、CoreApplicationView 和CoreWindow,而内部包含Application 和Window。 Application 和 Window 是内部部分,这很奇怪吗?原因是他们管理应用程序和窗口的 XAML 部分。
Window 是CoreWindow 的封装,以提供额外的 XAML UI 功能。和ApplicationView一样,是CoreApplication的封装,提供了额外的XAML UI功能。
详细地说,CoreWindow 是与 Windows 操作系统和 UWP 应用程序模型互操作的类。它提供了诸如窗口大小、位置、输入状态等功能。Window 是为窗口提供使用 XAML UI 能力的类,例如设置窗口的 XAML 内容、设置标题栏窗口的,或获取窗口的Compositor。 CoreApplicationView是与Windows操作系统互操作的类,提供windows消息循环机制和改变客户区和非客户区的能力。 ApplicationView 与 Window 相同,提供了为应用程序使用 XAML UI 的能力。
总之,CoreWindow 和CoreApplicationView 提供了操作系统和应用模型的底层核心功能。 Window 和 ApplicationView 封装它们以供 XAML 使用。