Win10/UWP开发—SystemNavigationManager
Win10系统为确保所有应用中的一致导航体验,提供后退导航功能。当你的应用在手机、平板电脑上或者在支持系统后退功能的电脑或笔记本电脑上运行时,系统会在"后退"按钮被按下时通知你的应用。 由你来决定要将哪些导航操作添加到导航历史记录以及应用如何响应后退按钮按下操作。参阅 UWP 应用的导航设计基础知识 以获取有关导航历史记录和后退行为的建议。
下面是每个通用 Windows 平台 (UWP) 设备类型提供的后退功能的分解情况:
|
电话 |
|
|
|
平板电脑 |
|
|
|
电脑、笔记本电脑和 Surface Hub |
|
|
我们接下来要做的事情就是当设备类型为电脑、笔记本或Surface Hub的时候,开启系统后退导航按钮并响应系统后退导航事件。
首先我们新建一个UWP通用App项目,暂且起名为:NavBackButtonSample
订阅后退导航按钮点击事件
打开App.cs文件,在OnLaunched事件中Frame对象初始化完毕后订阅SystemNavigationManager的BackRequested事件:
SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;
通过SystemNavigationManager.GetForCurrentView()方法我们能得到SystemNavigationManager对象,然后订阅对象的BackRequested事件,我们就可以在点击后退导航按钮时捕捉到该动作,从而在事件方法内部实现自己的逻辑。
响应后退导航按钮
private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
// 这里面可以任意选择控制哪个Frame
// 如果MainPage.xaml中使用了另外的Frame标签进行导航 可在此处获取需要GoBack的Frame
var rootFrame = Window.Current.Content as Frame; // ReSharper disable once PossibleNullReferenceException
if (!rootFrame.CanGoBack) return;
rootFrame.GoBack();
}
首先我们需要获取到需要GoBack的Frame对象,注意,如果我们在App的页面中又使用了另外的Frame元素进行导航的话需要获取实际进行导航的Frame对象来进行操作。然后判断是否可以goback后进行goback。
完成上面这些操作后,系统的导航按钮就具备了响应我们的点击事件,但是还有一件事情,PC、笔记本、Surface Hub的系统导航按钮默认是隐藏的,我们还需要使其显示出来,需要注意的是,在程序刚刚打开导航到首页或者从其他深层页面GoBack到首页时,我们需要隐藏系统导航按钮。
开启显示导航按钮
在App的OnLaunched事件中,我们订阅Frame的Navigated事件,Frame在每次做导航后,我们需要判断系统后退按钮是否显示(后退到首页时,系统后退按钮应该处于隐藏状态)。
//订阅导航完成时事件
rootFrame.Navigated += RootFrame_Navigated;
在Frame的Navigated事件中,判断App的Frame的导航堆栈中是否存在元素,如果存在元素就显示后退导航按钮,如果不存在元素则说明App目前处于首级Page,我们隐藏按钮:
private void RootFrame_Navigated(object sender, NavigationEventArgs e)
{
// 每次完成导航 确定下是否显示系统后退按钮
// ReSharper disable once PossibleNullReferenceException
SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
(Window.Current.Content as Frame).BackStack.Any()
? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
}
在判断Frame导航堆栈是否具有元素时,我们默认是获取的Windows.Current.Content对象为Frame。
通过上面的设置,我们的App的左上角在进行一次跳转后就会出现系统的后退导航按钮,此时我们点击该按钮系统就会进行一次Navigation GoBack的操作。
然后做完上面的操作还不够,虽然在PC、笔记本、surface hub设备上我们的代码运行起来是没问题的,可是当设备更改为平板电脑或者Phone时,当我们按下系统后退键,App会直接被退出。这是因为我们在SystemNavigationManager对象的BackRequested事件中没有对是否退出App做拦截。在BackRequested事件中做完rootFrame.GoBack();后添加e.Handled = true;更改后的代码如下:
private void App_BackRequested(object sender, BackRequestedEventArgs e)
{
// 这里面可以任意选择控制哪个Frame
// 如果MainPage.xaml中使用了另外的Frame标签进行导航 可在此处获取需要GoBack的Frame
var rootFrame = Window.Current.Content as Frame; // ReSharper disable once PossibleNullReferenceException
if (!rootFrame.CanGoBack) return;
rootFrame.GoBack();
// 设置指示应用程序已执行请求的后退导航操作
e.Handled = true;
}
效果图:

Win10/UWP开发—SystemNavigationManager的更多相关文章
- Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App
安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneG ...
- Win10/UWP开发—使用Cortana语音与App后台Service交互
上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比 ...
- Win10 UWP开发系列:实现Master/Detail布局
在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档: ...
- Win10 UWP开发实现Bing翻译
微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Wi ...
- Win10/UWP开发—凭据保险箱PasswordVault
PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么 ...
- Win10/UWP开发—使用Cortana语音指令与App的前台交互
Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调 ...
- Win10 UWP 开发系列:使用SQLite
在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中 ...
- Win10/UWP开发-Ink墨迹书写
在UWP开发中,微软提供了一个新型的InkCanvas控件用来让用户能书写墨迹,在新版的Edga浏览器中微软自己也用到了该控件使用户很方便的可以在web上做笔记. InkCanvas控件使用很简单,从 ...
- Win10 UWP 开发系列:使用多语言工具包让应用支持多语言
之前我在一篇blog中写过如何使用多语言工具包,见http://www.cnblogs.com/yanxiaodi/p/3800767.html 在WinEcos社区也发布过一篇详细的文章介绍多语言工 ...
随机推荐
- 听着好像很牛的特效——幽灵按钮DOM
给大家分享一个听着好像很牛的东西——幽灵按钮,这个玩意对于艺术设计细胞在高中决定不在考试试卷上画画的我来说,实在不感冒.但是这个按钮的设计元素很流行,一个网页东西不做几个,光放上几个按钮就会显得很高端 ...
- Vue2.X的状态管理vuex记录
记住上述的顺序情况:想要改变state,只能通过Mutation,虽然action可以直接改变state,这样会使每个状态可以方便的跟踪和记录(用Devtools跟踪) vue Method -- ...
- 三:关于tcp
转自:http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文章时,我想你也知道TCP的概念了,想要更深 ...
- 做App还是微信公众号,你该如何抉择?
我不够聪明,因为我经常出于好奇被自己提出的问题所困扰,于是乎就有些强迫症似的拼命去寻求答案——我只是想说服自己,让自己从困扰的谜团中清醒.坚定方向,进而能从容不迫的走下去... 最近在考虑一个问题:做 ...
- OpenGl在VS中的配置
刚开始接触OpenGl的时候难免会遇到一些问题,这些问题可能和程序无关,只是一些编译环境的设置和头文件的安装,特别整理了一下,如下: (1)将gult32.dll,glut.dll复制到windows ...
- Spring4.1新特性——Spring缓存框架增强(转)
目录 Spring4.1新特性——综述 Spring4.1新特性——Spring核心部分及其他 Spring4.1新特性——Spring缓存框架增强 Spring4.1新特性——异步调用和事件机制的异 ...
- 如何让WEBAPI 能够进行跨越访问
WebApi域名 http://localhost:11565 当部署好WebApi时,直接通过浏览器进行本地访问 这里是GET请求,此时访问成功 在部署一个Web,域名:http://localho ...
- Javascript下拉导航
1.右侧导航 tree.js function Toggle(e){ if(!document.getElementById) return; if(!e) var e = window.event; ...
- MicroERP软件更新记录2.1
最新版本:2.1 更新内容:新增客户关系管理(CRM) 下载地址:http://60.2.39.130/microerp 因部分企业用户或个人(开发者)的实际应用水平或技术开发能力参差不齐,且软件开发 ...
- 通过InputStream访问文件中的数据的四种方法
//方法一(每次只读取一个字节) public static void getFile() throws IOException { File file = new File("D:\\a. ...


