Win10/UWP开发—SystemNavigationManager

Win10系统为确保所有应用中的一致导航体验,提供后退导航功能。当你的应用在手机、平板电脑上或者在支持系统后退功能的电脑或笔记本电脑上运行时,系统会在"后退"按钮被按下时通知你的应用。 由你来决定要将哪些导航操作添加到导航历史记录以及应用如何响应后退按钮按下操作。参阅 UWP 应用的导航设计基础知识 以获取有关导航历史记录和后退行为的建议。

下面是每个通用 Windows 平台 (UWP) 设备类型提供的后退功能的分解情况:


电话


  • 始终存在。
  • 显示在屏幕底部。
  • 提供应用内和应用间的后退导航。

平板电脑


  • 始终存在(当 Windows 处于平板电脑模式时)。(平板电脑用户可在平板电脑模式下运行与在桌面模式下运行之间切换)。
  • 显示在屏幕底部。
  • 提供应用内和应用间的后退导航。

电脑、笔记本电脑和 Surface Hub


  • 默认处于禁用状态。开发人员可以选择启用它。
  • 显示在应用的标题栏中。
  • 仅在应用内提供后退导航。不提供应用间的导航。

我们接下来要做的事情就是当设备类型为电脑、笔记本或Surface Hub的时候,开启系统后退导航按钮并响应系统后退导航事件。

首先我们新建一个UWP通用App项目,暂且起名为:NavBackButtonSample

订阅后退导航按钮点击事件

打开App.cs文件,在OnLaunched事件中Frame对象初始化完毕后订阅SystemNavigationManager的BackRequested事件:

SystemNavigationManager.GetForCurrentView().BackRequested += App_BackRequested;

通过SystemNavigationManager.GetForCurrentView()方法我们能得到SystemNavigationManager对象,然后订阅对象的BackRequested事件,我们就可以在点击后退导航按钮时捕捉到该动作,从而在事件方法内部实现自己的逻辑。

响应后退导航按钮

 1 private void App_BackRequested(object sender, BackRequestedEventArgs e)
 2 {
 3     // 这里面可以任意选择控制哪个Frame
 4     // 如果MainPage.xaml中使用了另外的Frame标签进行导航 可在此处获取需要GoBack的Frame
 5     var rootFrame = Window.Current.Content as Frame;
 6
 7     // ReSharper disable once PossibleNullReferenceException
 8     if (!rootFrame.CanGoBack) return;
 9     rootFrame.GoBack();
10 }

首先我们需要获取到需要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,我们隐藏按钮:

1 private void RootFrame_Navigated(object sender, NavigationEventArgs e)
2 {
3     // 每次完成导航 确定下是否显示系统后退按钮
4     // ReSharper disable once PossibleNullReferenceException
5     SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility =
6         (Window.Current.Content as Frame).BackStack.Any()
7         ? AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
8 }

在判断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;
}

效果图:

时间: 2024-08-29 13:24:33

Win10/UWP开发—SystemNavigationManager的相关文章

Win10 UWP开发系列:使用VS2015 Update2+ionic开发第一个Cordova App

安装VS2015 Update2的过程是非常曲折的.还好经过不懈的努力,终于折腾成功了. 如果开发Cordova项目的话,推荐大家用一下ionic这个框架,效果还不错.对于Cordova.PhoneGap.ionic.AngularJS这些框架或库的关系,我个人理解是这样,PhoneGap是一个商业项目,用来实现HTML5式的跨平台开发,后来Adobe公司将其中的核心代码开源,就是Cordova,Cordova只负责实现JavaScript调用原生代码的功能,是一个壳,而壳里具体用什么样式,在H

Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题

原文:Win10 UWP开发系列:解决Win10不同版本的Style差异导致的兼容性问题 最近在开发一个项目时,遇到了一个奇怪的问题,项目依赖的最低版本是10586,目标版本是14393,开发完毕发布到商店后,很多用户报无法正常加载页面.经查,有问题的都是Win10 10586版本. 我上篇博客中写到的自定义的AppBar控件,也存在这个问题,10586会报错. 为此特意下载了10586的SDK调试.错误显示,一个样式找不到,名为ListViewItemBackground.因为开发的时候是基于

Win10 UWP开发系列——开源控件库:UWPCommunityToolkit

原文:Win10 UWP开发系列--开源控件库:UWPCommunityToolkit 在开发应用的过程中,不可避免的会使用第三方类库.之前用过一个WinRTXamlToolkit.UWP,现在微软官方发布了一个新的开源控件库—— UWPCommunityToolkit 项目代码托管在Github上:https://github.com/Microsoft/UWPCommunityToolkit 包括以下几个类库: 都可以很方便的从Nuget上安装. NuGet Package Name des

Win10/UWP开发—使用Cortana语音与App后台Service交互

上篇文章中我们介绍了使用Cortana调用前台App,不熟悉的移步到:Win10/UWP开发—使用Cortana语音指令与App的前台交互,这篇我们讲讲如何使用Cortana调用App的后台任务,相比调用前台的App,调用后台任务有个有点就是App不用被启动即可为用户提供服务. 要想使用Cortana调用App后台任务,首先我们需要定义VCD文件,我们依旧使用上篇中的代码,让它支持Cortana调用后台任务. 创建后台任务 新增一个[Windows运行时组件]项目,暂时起名叫做:XiaoMiBa

Win10 UWP开发系列:实现Master/Detail布局

在开发XX新闻的过程中,UI部分使用了Master/Detail(大纲/细节)布局样式.Win10系统中的邮件App就是这种样式,左侧一个列表,右侧是详情页面.关于这种 样式的说明可参看MSDN文档:https://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/dn997765.aspx 样式如下: 在微软官方的Sample里,有这种样式的代码示例,下载地址:https://github.com/Microsoft/Windows-univ

Win10 UWP开发实现Bing翻译

微软在WP上的发展从原来的Win7到Win8,Win8.1,到现在的Win10 UWP,什么是UWP,UWP即Windows 10 中的Universal Windows Platform简称.即Windows通用应用平台,在Win 10 Mobile/Surface(Windows平板电脑)/PC/Xbox/HoloLens等平台上运行,uwp不同于传统pc上的exe应用也跟只适用于手机端的app有本质区别.它并不是为某一个终端而设计,而是可以在所有windows10设备上运行. 简单的说,u

Win10/UWP开发—使用Cortana语音指令与App的前台交互

Win10开发中最具有系统特色的功能点绝对少不了集成Cortana语音指令,其实Cortana语音指令在以前的wp8/8.1时就已经存在了,发展到了Win10,Cortana最明显的进步就是开始支持调用App 的App Service.当然App Service也是Win10 App的新特性之一,通过调用App Service就可以在App没有前台运行的时候为Cortana提供数据交互.这样一来Cortana就具有了两种App交互方式: Cortana语音指令与前台App的交互 Cortana语

Win10/UWP开发—凭据保险箱PasswordVault

PasswordVault用户凭据保险箱其实并不算是Win10的新功能,早在Windows 8.0时代就已经存在了,本文仅仅是介绍在UWP应用中如何使用凭据保险箱进行安全存储和检索用户凭据. 那么什么是凭据保险箱呢?简单的说就是开发者可以在用户输入完凭证(一般是用户名和密码),凭证有效的情况下将该凭证存储在叫做"凭据保险箱"里,该凭据保险箱里的用户凭据将会自动漫游到用户设备的Windows账户中并随时能够再次被App获取. 例如:有一个UWP的App运行在PC上,某用户在使用该App时

Win10 UWP 开发系列:使用SQLite

在App开发过程中,肯定需要有一些数据要存储在本地,简单的配置可以序列化后存成文件,比如LocalSettings的方式,或保存在独立存储中.但如果数据多的话,还是需要本地数据库的支持.在UWP开发中,可以使用SQLite.本篇文章说一下如何在UWP中使用SQLite.因为SQLite是跨平台的,版本众多,我刚开始用的时候不知道要装哪个,什么WP8的.WP8.1的.Win RT的……简直摸不着头脑.希望这篇文章能让大家少走点弯路. 其实这篇文章写到一半就看到已经有大神写了这个:http://ww