理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图) UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式。不过,总有一些特别的情况下我们需要用到不止一个窗口,那么 UWP 中如何使用多窗口呢? 本文内容 为什么 UWP 需要多窗口? UWP 视图的概念 UWP 多窗口 管理多个 UWP 视图 参考资料 为什么 UWP 需要多窗口? 多窗口在传统 Win32 的开发当中是司空见惯的事儿了,不过我个人非常不喜欢,因为 Windows 系统上的多窗口太多坑。

原文 理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)

UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式。不过,总有一些特别的情况下我们需要用到不止一个窗口,那么 UWP 中如何使用多窗口呢?


为什么 UWP 需要多窗口?

多窗口在传统 Win32 的开发当中是司空见惯的事儿了,不过我个人非常不喜欢,因为 Windows 系统上的多窗口太多坑。以下是我以前写的关于传统多窗口开发中的一些坑(除此之外还有更多):

使用多窗口的原因很简单 —— 允许用户多任务处理。从这个角度来说,传统 Win32 使用“模态”多窗口的方式简直是低效的同时还带来 Bug!

微软官方文档中列举了一些例子:例如一边写邮件一边参考以往的邮件;一边看正在播放的音乐一边浏览播放列表;一次性打开多份文章然后稍后一起阅读等。

UWP 视图的概念

在学习如何编写 UWP 多窗口之前,我们需要了解一些 UWP 视图(View)的概念。

在 CoreApplication/Application、CoreWindow/Window 之间的区别 一文中,我描述了 UWP 视图的一些概念:

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

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

在 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序 一文中,我们也能体会到 CoreApplication 和 CoreWindow 之间的关系,了解消息循环在应用中的作用。

UWP 应用视图

UWP 多窗口

在了解到 UWP 视图的概念之后,严格意义上说,这一节的标题应该叫做 “UWP 多视图”。

我画了一个思维导图来描述它们之间的关系。CoreApplication 有静态方法 CreateNewView,调用后能够创建新的 CoreApplicationView,这包含一个完整的 CoreWindow 和 CoreDispatcher

UWP 创建应用视图

创建并显示一个新 CoreApplicationView 的代码如下:

private async void OnLoaded(object sender, RoutedEventArgs e) { // 创建一个 CoreApplicationView,即新的应用视图。 var applicationView = CoreApplication.CreateNewView(); // 一个应用视图有自己的 Id,稍后我们创建应用视图的时候,需要记录这个 Id。 int newViewId = 0; // 使用新应用视图的 CoreDispatcher 线程调度模型来执行新视图中的操作。 await applicationView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { // 在新的应用视图中,我们将新的窗口内容设置为 ThePageInNewView 页面。 Frame frame = new Frame(); frame.Navigate(typeof(ThePageInNewView), null); Window.Current.Content = frame; Window.Current.Activate(); // 记录新应用视图的 Id,这样才能稍后切换。 newViewId = ApplicationView.GetForCurrentView().Id; }); // 使用刚刚记录的新应用视图 Id 显示新的应用视图。 var viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId); } 

创建完后的效果如下图:

UWP 多窗口

管理多个 UWP 视图

我们平时开发 UWP 应用的时候很少去关心 CoreApplicationView,因为默认情况下 UWP 能为我们做很多管理应用视图的工作。

CoreApplication 有一个 MainView 属性,即我们一开始运行 UWP 应用时的那个应用视图。如果我们有不止一个应用视图显示出来,那么这时点击主窗口的关闭按钮将不再是关闭,而是隐藏。如果要关闭,需要调用 Application.Exit

CoreApplication 有 Views 属性储存所有的 CoreApplicationView,我们可以使用此集合来管理多个视图。使用 ApplicationViewSwitcher.SwitchAsync 并传入视图 Id 可以切换视图的显示。

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow); 

参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/show-multiple-views-for-an-uwp-app.html,以避免陈旧错误知识的误导,同时有更好的阅读体验。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
计算机视觉 容器
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
Qt实用技巧:在Qt Gui程序中嵌入qml界面(可动态覆盖整个窗口)
|
4月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
6月前
|
C++ UED 开发者
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
逆向学习 MFC 篇:视图分割和在 C++ 的 Windows 窗口程序中添加图标的方法
89 0
QT图形视图系统 - 使用一个项目来学习QT的图形视图框架 - 终篇
接上一篇,我们需要继续完成以下的效果; 先上个效果图:
127 0
|
C# Windows
利用WPF创建含多种交互特性的无边框窗体
原文:利用WPF创建含多种交互特性的无边框窗体 咳咳,标题一口气读下来确实有点累,让我先解释一下。另外文章底部有演示程序的下载。
1268 0
利用WPF创建含多种交互特性的无边框窗体
|
前端开发 C#
使用MVVM DataTriggers在WPF XAML视图之间切换/Window窗口自适应内容大小并居中
原文 使用MVVM DataTriggers在WPF XAML视图之间切换 相关文章: http://www.technical-recipes.com/2016/switching-between-wpf-xaml-views-using-mvvm-datatemplate/ 这篇文章解决了能够根据ViewModel类的属性在不同视图之间切换的问题。
1879 0
|
API C# Windows
WPF中用于嵌入其他进程窗口的自定义控件(AppContainer)
原文:WPF中用于嵌入其他进程窗口的自定义控件(AppContainer) 版权声明:本文为博主原创文章,转载请注明作者和出处 https://blog.csdn.net/ZZZWWWPPP11199988899/article/details/78131292        在Windows上开发客户端程序的时候,有时候我们希望能将其他进程的窗口嵌入到我们自己的程序窗口中,从视觉效果上看就像是其他进程的窗口时我们自己的程序窗口的一部分。
3445 0
|
C#
[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口                            [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口                                              周银辉 现象: 大家可以...
1278 0
|
Windows
背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作
原文:背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 [源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIEle...
1155 0