按例,老周今天要讲一个故事,这个故事之前老周在微博上分享过。大伙知道在8.1的时候,有一个扩展类库——NotificationExtensions,可以真TMD轻松生成通知XML模板,其实,这个类库也支持UWP的自适应通知模板,要是你需要的话,可以握紧鼠标,拼命点这里:https://github.com/WindowsNotifications/NotificationsExtensions

这是Github上的开源组件,至于说github是什么,不要问我,老周也不知道是什么。

================================================

好了,简单的开场白说完了,要是不谈正事的话,老周担心有人会扔砖头了。你如果要扔的话,请不要扔普通的砖头,普通砖头老周不要,你最好扔几块新出土的,魏晋时期的,上面刻有“永和九年”字样的砖头,你扔这种砖头,老周会接的。

以往,在Windows Phone 8.1应用中,我们可以处理硬件按钮事件来处理“回退”键,就是手机下方,一个向左箭头的键,按它可以后退的。

在UWP中,也确实很海纳百川地兼容这种做法,然而,UWP是完全通用的,不似8.1时候那样划分共享代码实为两个项目,UWP是单应用通用,所以,处理这个回退键,总得考虑一下PC/平板、xBox上的情形。故老周不推荐使用老方法。

SDK 开发团队也不是傻子,既然要通了,就要一通到底,不然怎么叫“全球通”呢,当然了,不是某移动的全球通。为了能让这一事件处理能够在N + 105种设备上都能兼容,UWP 运行时公开了一个类叫SystemNavigationManager,你如果不知道这类在哪,老周说过上千遍了,打开“对象浏览器”窗口进行搜索就行了。

哦,对了,如果你安装了多个版本的SDK,可能你会看到1.0,2.0之类的东东,比如这样。

老周记得曾经给大家用最不专业的语言介绍过,UWP API(配置中叫 UAP)是通过一系列XML文件进行版本配置,不同版本之间可以友好相处。此处1.0是10240时的API集,2.0是10586时的API集。而通过XML配置版本的形式灵活在这里,1.0和2.0的API不是完全独立,有的API是共用的,所以,如果你有10240和10586的SDK,不用去卸载旧版本的,因为里面有共享的内容,以后微软会继续增加功能,只要把新的.wimd融合进去就行了,再更新一下XML文件即可,不必做大的改动,这样方便扩展。

好,没要紧的屁话说完了,为什么说那么多F话呢,因为这个SystemNavigationManager类用起来很简单,所以,老周不用花太多的时间去说。

手机上的回退键就不多说了,那,PC/平板上的呢。其实,你如果细心的话,早就发现了,在比如“应用商店”等内置应用中就看到了。

在桌面模式下,这个后退按钮显示在窗口标题栏的左边。

在平板模式下,由于窗口标题栏会隐藏,所以会在系统的任务栏上(“开始”按钮右边)显示一个向左的箭头,这个就是回退键。

发现这些不需要天赋,只要你细心,什么都逃不过你的法眼。

使用SystemNavigationManager类时应调用静态方法GetForCurrentView,这样你就能得到该类的一个实例。在桌面模式下,默认情况回退键是不会显示的,要让它显示,就在App类重写的OnLaunch方法中加上这些代码:

            SystemNavigationManager navmgr = SystemNavigationManager.GetForCurrentView();
navmgr.AppViewBackButtonVisibility = AppViewBackButtonVisibility.Visible;

修改AppViewBackButtonVisibility属性就可以控制这个按钮是否显示了。

然后,我们还得处理BackRequested事件,这个好理解,就是回退键被按后,就会发生这个事件,在手机和平板模式下,系统行为是返回上一个应用或回到开始屏幕;在桌面模式下没反应。

如果你希望这个回退键被按后,不是直接执行系统行为,而是先让应用程序在Frame导航堆栈中后退,等到“无路可退”时,你有两种措施:一种是跟随系统默认行为;另一种是退出应用程序。

事件处理参数有一个Handled属性,把它设置为 true ,就可以屏蔽系统行为,然后你自行处理。比如我这个例子,有三个页——主页、第二页、第三页,从主页可以分别导航到第二页或第三页,然后按回退键后退回主页;到了主页后,不能再退,再次按下回退键就直接退出程序。

好,看代码。

            Frame root = Window.Current.Content as Frame;
if (root != null)
{
if (root.CanGoBack)
{
e.Handled = true;
root.GoBack();
}
else
{
this.Exit();
}
}

退出应用程序的方法是调用从 Application 类继承的 Exit 方法。上面代码不复杂,相信能理解。

最终效果如下图。

运行后,进入其他页面,然后点击回退按钮退回主页,再点一次,就退出。

OK,今天的节目就到这里,剧组缺钱,不能再加时了。欢迎继续关注火星电视台的节目更新。

示例源代码下载地址

【Win 10应用开发】响应系统回退键的导航事件的更多相关文章

  1. 【Win 10应用开发】认识一下UAP项目

    Windows 10 SDK预览版需要10030以上版本号的Win 10预览版系统才能使用.之前我安装的9926的系统,然后安装VS 2015 CTP 6,再装Win 10 SDK,但是在新建项目后, ...

  2. win 10 自带 Ubuntu 系统的文件位置

    win 10 自带 Ubuntu 系统的文件位置 Ubuntu 作为最为流行 Linux 系统中的一种,是用来学习 Linux 相关知识是最好不过的选择.专门搞一个 Ubuntu 系统的电脑不太现实, ...

  3. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  4. 【Win 10 应用开发】导入.pfx证书

    这个功能其实并不常用,一般开发较少涉及到证书,不过,简单了解一下还是有必要的. 先来说说制作测试证书的方法,这里老周讲两种方法,可以生成用于测试的.pfx文件. 产生证书,大家都知道有个makecer ...

  5. 【Win 10应用开发】Adaptive磁贴模板的XML文档结构

    在若干天之前,老周给大家讲了Adaptive Toast通知的XML模板,所以相应地,今天老周给大家介绍一下Adaptive磁贴的新XML模板. 同样道理,你依旧可以使用8.1时候的磁贴模板,在win ...

  6. 【Win 10 应用开发】在代码中加载文本资源

    记得前一次,老周给大伙,不,小伙伴们介绍了如何填写 .resw 文件,并且在 XAML 中使用 x:Uid 标记来加载.也顺便给大伙儿分析了运行时是如何解析 .resw 文件的. 本来说好了,后续老周 ...

  7. 【Win 10应用开发】延迟共享

    延迟共享是啥呢,这么说吧,就是在应用程序打开共享面板选择共享目标时,不会设置要共享的数据,而是等到共享目标请求数据时,才会发送数据,而且,延迟操作可以在后台进行. 这样说似乎过于抽象,最好的诠释方法, ...

  8. 【Win 10 应用开发】RTM版的UAP项目解剖

    Windows 10 发布后,其实SDK也偷偷地在VS的自定义安装列表中出现了,今天开发人员中心也更新了下载.正式版的SDK在API结构上和以前预览的时候是一样的,只是版本变成10240罢了,所以大家 ...

  9. Win 10 和 Linux 双系统,从硬盘删除Linux分区,Win 10引导修复

    由于安装双系统后,Linux 用的比较少.因此,从Win 10 磁盘管理中删除了linux 占用的磁盘空间,重启后无法进入win 10 ,出现如下情况: 有人提出,此时需要重装系统,并不用如此麻烦,通 ...

随机推荐

  1. 比Mysqli操作数据库更简便的方式 。PDO

    下面来说一下PDO 先画一张图来了解一下 mysqli是针对mysql这个数据库扩展的一个类 PDO是为了能访问更多数据库 如果出现程序需要访问其他数据库的话就可以用PDO来做 PDO数据访问抽象层1 ...

  2. ASP.NET MVC开发:Web项目开发必备知识点

    最近加班加点完成一个Web项目,使用Asp.net MVC开发.很久以前接触的Asp.net开发还是Aspx形式,什么Razor引擎,什么MVC还是这次开发才明白,可以算是新手. 对新手而言,那进行A ...

  3. MJRefresh 源码解读 + 使用

    MJRefresh这个刷新控件是一款非常好用的框架,我们在使用一个框架的同时,最好能了解下它的实现原理,不管是根据业务要求在原有的基础上修改代码,还是其他的目的,弄明白作者的思路和代码风格,会受益匪浅 ...

  4. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  5. 【深入Java虚拟机】之四:类加载机制

    类加载过程     类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段.它们开始的顺序如下图所示: 其中类加载的过程包括了加载.验 ...

  6. 【转】java通用URL接口地址调用方式GET和POST方式

    java通用URL接口地址调用方式GET和POST方式,包括建立请求和设置请求头部信息等等......... import java.io.ByteArrayOutputStream; import ...

  7. 灵魂宝石 bzoj 2663

    灵魂宝石(1s 128MB)soulgem [问题描述] "作为你们本体的灵魂,为了能够更好的运用魔法,被赋予了既小巧又安全的外形" 我们知道,魔法少女的生命被存放于一个称为灵魂宝 ...

  8. 茂名石化BPM应用实践 ——业务协同及服务共享平台建设和应用

    一.茂名石化简介 茂名石化隶属于中国石油化工集团公司,创建于1955年,是国家"一五"期间156项重点项目之一.经过50多年的发展,茂名石化已成为我国生产规模最大的炼油化工企业之一 ...

  9. git提交项目到已存在的远程分支

    今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建.   之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...

  10. Atitit.研发团队的管理原则---立长不立贤与按资排辈原则

    Atitit.研发团队的管理原则---立长不立贤与按资排辈原则 1. 组织任命原则概述1 2. 历史的角度看,大部分组织使用的立长不立贤原则1 3. 论资排辈 立长不立贤原则1 3.1. 资格和辈分是 ...