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

按例,老周今天要讲一个故事,这个故事之前老周在微博上分享过。大伙知道在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,今天的节目就到这里,剧组缺钱,不能再加时了。欢迎继续关注火星电视台的节目更新。

 

示例源代码下载地址

 

posted @ 2016-01-28 12:38  东邪独孤  阅读(1037)  评论(1编辑  收藏  举报