Windows Phone 8.1中处理后退键的HardwareButtons.BackPressed事件
在WP8中,处理后退键比较简单,重写OnBackKeyPress事件即可。如经常用的双击后退键退出的功能,用户在MainPage页面第一次点击后退键时,弹出一个对话框"是否退出?",在短时间内如两秒钟内再次点击后退键则退出,否则不退出。只要处理e.Cancel值为true即可取消后退键的默认操作。代码如下:
private private
protected { dtBackTimeSecond = System.DateTime.Now; TimeSpan ts = dtBackTimeSecond - dtBackTimeFirst; if (ts >= new { UIService.Instance.ShowToastPrompt("8-)", AppResources.App_Toast_PressBackToExit_Message); e.Cancel = true; dtBackTimeFirst = dtBackTimeSecond; } else { base.OnBackKeyPress(e); }
} |
到了WP8.1中,方式就变了,后退键的事件变成了Windows.Phone.UI.Input.HardwareButtons.BackPressed,WP8.1的导航和WP8是不同的,如果在页面不做处理的话,点击后退键就直接后台了,而不是返回之前的页面。因此这个事件必须单独进行处理,好在VS的模板已经添加了一个NavigationHelper的类,帮助处理导航。除了MainPage页面,添加其他页面时,VS会在页面的构造函数中自动注册这个类来帮助导航:代码如下:
this.navigationHelper = new this.navigationHelper.LoadState += this.NavigationHelper_LoadState; this.navigationHelper.SaveState += this.NavigationHelper_SaveState; |
下面还有:
/// /// Populates the page with content passed during navigation. Any saved state is also /// provided when recreating a page from a prior session. /// /// /// The source of the event; typically <see cref="NavigationHelper"/> /// /// /// /// a dictionary of state preserved by this page during an earlier /// session. The state will be null the first time a page is visited.</param> private { //Let Viewmodel Handle the Load/Save State Logic base.LoadState(e.NavigationParameter, e.PageState); }
/// /// Preserves state associated with this page in case the application is suspended or the /// page is discarded from the navigation cache. Values must conform to the serialization /// requirements of <see cref="SuspensionManager.SessionState"/>. /// /// /// /// serializable state.</param> private { //Let Viewmodel Handle the Load/Save State Logic base.SaveState(e.PageState); }
#region NavigationHelper registration
/// The methods provided in this section are simply used to allow /// NavigationHelper to respond to the page's navigation methods. /// /// Page specific logic should be placed in event handlers for the /// /// and <see cref="GridCS.Common.NavigationHelper.SaveState"/>. /// The navigation parameter is available in the LoadState method /// in addition to page state preserved during an earlier session.
protected { base.OnNavigatedTo(e); navigationHelper.OnNavigatedTo(e); }
protected { base.OnNavigatedFrom(e); navigationHelper.OnNavigatedFrom(e); }
#endregion |
这样我们就不用手动处理后退键了,在其他页面中点击后退键会自动返回到上一页。
那么需要继续实现双击退出提示,就需要手动注册HardwareButtons.BackPressed事件了。代码修改为:
protected { base.OnNavigatedTo(e); navigationHelper.OnNavigatedTo(e); Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtonsOnBackPressed; } protected { Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtonsOnBackPressed; base.OnNavigatedFrom(e); navigationHelper.OnNavigatedFrom(e); } |
然后处理后退键:
private private protected {
if (CommonAppSettings.IsEnableDoubleBackKeyPressToExit) { dtBackTimeSecond = System.DateTime.Now; TimeSpan ts = dtBackTimeSecond - dtBackTimeFirst; if (ts >= new { UIService.Instance.ShowToastPrompt("", "再按一次返回键退出程序 8-)"); e.Cancel = true; dtBackTimeFirst = dtBackTimeSecond; } else { base.OnBackKeyPress(e); } } else { base.OnBackKeyPress(e); }
} |
这样就行了。
但是在处理二级页面的时候,遇到了一点问题。在文章详情页面,我放了一个隐藏的Grid,用来显示评论列表。当评论列表显示的时候,点击后退键应该是隐藏评论列表,而不是返回首页。于是我想当然的也处理HardwareButtons.BackPressed事件:
private { var vm = this.LayoutRoot.DataContext as if (vm != null) { if (vm.IsShowComments) { e.Handled = true; vm.IsShowComments = false; } }
} |
但是,没起作用,设置了e.Handled = true后页面仍然返回了首页。
为什么会发生这种情况呢?于是看NavigationHelper这个类的代码,这个类里注册了HardwareButtons.BackPressed事件,是放在Windows Phone的条件编译里:
/// /// Invoked when the hardware back button is pressed. For Windows Phone only. /// /// /// private { if (this.GoBackCommand.CanExecute(null)) { e.Handled = true; this.GoBackCommand.Execute(null); } } |
原因找到了,虽然我在页面里手动处理了HardwareButtons.BackPressed事件,但因为NavigationHelper
仍然在起作用,因此仍然执行了GoBackCommand,于是又后退了。
那么修改一下,只有当e.Handled为false的时候再让NavigationHelper起作用吧:
private { if (this.GoBackCommand.CanExecute(null) && !e.Handled) { e.Handled = true; this.GoBackCommand.Execute(null); } } |
当执行到这里时,因为我们之前已经手动让e.Handled为true了,所以这里就不执行了,达到了显示评论列表的时候点击后退键隐藏列表而不是返回上一页的目的。
Windows Phone 8.1中处理后退键的HardwareButtons.BackPressed事件的更多相关文章
- 安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数
安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数
- android中的后退键——onBackPressed()的使用
转自:http://blog.sina.com.cn/s/blog_5085156c0101725e.html 很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键 ...
- react-router 中的history(react中关于后退键的处理用的到)
react-router 中的history react-router 是建立在history之上的:我们来谈谈这个history吧. github: mjackson/history history ...
- 自己写方法处理WP(RT)后退键事件处理
不用微软的NavigationHelper,自己写方法处理WP后退键事件 在WP8.1(RT)程序中,你会发现按下后退键时,应用会直接退出,变为后台运行,这是因为RT与Silverlight对后退键的 ...
- WP开发笔记——阻止Back后退键
WP7中如何阻止Back后退键的后退事件呢? WP7上提供了物理的Back按键,获取Back物理键按下可以通过PhoneApplicationPage的BackKeyPress事件. 具体实现方法如下 ...
- Windows 10 版本 1507 中的新 AppLocker 功能
要查看 Windows 10 版本信息,使用[运行]> dxdiag 回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...
- 按后退键退出Android程序
主要的目的是按后退键的时候,让程序能够退出. 实现起来的思路: 1.捕获后退键被按了这个事件. Java代码 @Override public boolean onKeyDown(int keyCo ...
- 处理 Windows Phone 应用中的“后退”按钮 (XAML)
与电脑不同,所有 Windows Phone 设备都有“后退”按钮,它允许用户在应用的页面之间向后导航.如果用户在转到应用的第一页时再次按“后退”按钮,操作系统会挂起你的应用并将用户导航到应用启动前的 ...
- 【Win10开发】处理PC上的后退键
我们知道在win10手机上和平板上都会有后退键,那么PC上该怎么办呢?没关系我们慢慢揭晓. 如果你已经是UWP的忠实用户,那么肯定会见到如下的后退键. 那么我们如何来做出来呢?, 我们首先打开App. ...
随机推荐
- 设计模式之美:Dynamic Property(动态属性)
索引 别名 意图 结构 参与者 适用性 效果 实现 实现方式(一):Dynamic Property 的示例实现. 别名 Property Properties Property List 意图 使对 ...
- 海量用户-高并发SAAS产品测试上线流程
海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1 概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用 ...
- Redis快速入门详解
Redis入门详解 Redis简介 Redis安装 Redis配置 Redis数据类型 Redis功能 持久化 主从复制 事务支持 发布订阅 管道 虚拟内存 Redis性能 Redis部署 Redis ...
- 缓存篇~第八回 Redis实现基于方法签名的数据集缓存~续(优化缓存中的key)
返回目录 上一讲主要是说如何将数据集存储到redis服务器里,而今天主要说的是缓存里的键名,我们习惯叫它key. redis或者其它缓存组件实现的存储机制里,它将很多方法对应的数据集存储在一个公共的空 ...
- Android 神兵利器—— Adb 常用命令
总结的Android工具类文章: Android 神兵利器-- Adb 常用命令 Android 神兵利器-- Git 常用命令 Adb的全称为Android Debug Bridge,是管理andr ...
- Java学习第一天
Java学习第一天 对于网络管理员或者黑客必须知道的八个cmd命令 详情请参考:http://www.2cto.com/os/201608/533964.html nbtstat ...
- require.js笔记
笔记参考来源:阮一峰 http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 1. 浏览器端的模块只能采用“异步加载”方式 = ...
- SQL Server的小数数值类型(float 和 decimal)用法
在SQL Server中,小数数值实际上只有两种数据类型:float 和 decimal.double precision 整体是数据类型,等价于 float(53),real等价于float(24) ...
- 【WP开发】如何处理溢出的文本
本文内容适用于Runtime App框架 在用户界面上显示文本,用得严重多的是TextBlock,凡是轻量级的东西都会很常用,TextBlock对于显示简单.少量的文本内容相当适合,不过,在我们考虑要 ...
- 哈夫曼树(三)之 Java详解
前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...