【Win 10应用开发】响应系统回退键的导航事件

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

 

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

 

================================================浏览器

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

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

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

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

哦,对了,若是你安装了多个版本的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文件便可,没必要作大的改动,这样方便扩展。blog

 

好,没要紧的屁话说完了,为何说那么多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,今天的节目就到这里,剧组缺钱,不能再加时了。欢迎继续关注火星电视台的节目更新。

 

示例源代码下载地址

相关文章
相关标签/搜索