在WP8中,处理后退键比较简单,重写OnBackKeyPress事件即可。如经常用的双击后退键退出的功能,用户在MainPage页面第一次点击后退键时,弹出一个对话框"是否退出?",在短时间内如两秒钟内再次点击后退键则退出,否则不退出。只要处理e.Cancel值为true即可取消后退键的默认操作。代码如下:

private
DateTime dtBackTimeFirst;

private
DateTime dtBackTimeSecond;

 

protected
override
void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)

{

dtBackTimeSecond = System.DateTime.Now;

TimeSpan ts = dtBackTimeSecond - dtBackTimeFirst;

if (ts >= new
TimeSpan(0, 0, 2))

{

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
NavigationHelper(this);

this.navigationHelper.LoadState += this.NavigationHelper_LoadState;

this.navigationHelper.SaveState += this.NavigationHelper_SaveState;

下面还有:

///
<summary>

/// Populates the page with content passed during navigation. Any saved state is also

/// provided when recreating a page from a prior session.

///
</summary>

///
<param name="sender">

/// The source of the event; typically <see cref="NavigationHelper"/>

///
</param>

///
<param name="e">Event data that provides both the navigation parameter passed to

///
<see cref="Frame.Navigate(Type, Object)"/> when this page was initially requested and

/// 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
void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)

{

//Let Viewmodel Handle the Load/Save State Logic

base.LoadState(e.NavigationParameter, e.PageState);

}

 

///
<summary>

/// 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"/>.

///
</summary>

///
<param name="sender">The source of the event; typically <see cref="NavigationHelper"/></param>

///
<param name="e">Event data that provides an empty dictionary to be populated with

/// serializable state.</param>

private
void NavigationHelper_SaveState(object sender, SaveStateEventArgs e)

{

//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

///
<see cref="GridCS.Common.NavigationHelper.LoadState"/>

/// 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
override
void OnNavigatedTo(NavigationEventArgs e)

{

base.OnNavigatedTo(e);

navigationHelper.OnNavigatedTo(e);

}

 

protected
override
void OnNavigatedFrom(NavigationEventArgs e)

{

base.OnNavigatedFrom(e);

navigationHelper.OnNavigatedFrom(e);

}

 

#endregion

这样我们就不用手动处理后退键了,在其他页面中点击后退键会自动返回到上一页。

 

那么需要继续实现双击退出提示,就需要手动注册HardwareButtons.BackPressed事件了。代码修改为:

protected
override
void OnNavigatedTo(NavigationEventArgs e)

{

base.OnNavigatedTo(e);

navigationHelper.OnNavigatedTo(e);

Windows.Phone.UI.Input.HardwareButtons.BackPressed += HardwareButtonsOnBackPressed;

}

protected
override
void OnNavigatedFrom(NavigationEventArgs e)

{

Windows.Phone.UI.Input.HardwareButtons.BackPressed -= HardwareButtonsOnBackPressed;

base.OnNavigatedFrom(e);

navigationHelper.OnNavigatedFrom(e);

}

然后处理后退键:

private
DateTime dtBackTimeFirst;

private
DateTime dtBackTimeSecond;

protected
override
void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)

{

 

if (CommonAppSettings.IsEnableDoubleBackKeyPressToExit)

{

dtBackTimeSecond = System.DateTime.Now;

TimeSpan ts = dtBackTimeSecond - dtBackTimeFirst;

if (ts >= new
TimeSpan(0, 0, 2))

{

UIService.Instance.ShowToastPrompt("", "再按一次返回键退出程序 8-)");

e.Cancel = true;

dtBackTimeFirst = dtBackTimeSecond;

}

else

{

base.OnBackKeyPress(e);

}

}

else

{

base.OnBackKeyPress(e);

}

 

}

这样就行了。

 

但是在处理二级页面的时候,遇到了一点问题。在文章详情页面,我放了一个隐藏的Grid,用来显示评论列表。当评论列表显示的时候,点击后退键应该是隐藏评论列表,而不是返回首页。于是我想当然的也处理HardwareButtons.BackPressed事件:

private
void HardwareButtonsOnBackPressed(object sender, BackPressedEventArgs e)

{

var vm = this.LayoutRoot.DataContext as
ArticleDetailPage_Model;

if (vm != null)

{

if (vm.IsShowComments)

{

e.Handled = true;

vm.IsShowComments = false;

}

}

 

}

但是,没起作用,设置了e.Handled = true后页面仍然返回了首页。

为什么会发生这种情况呢?于是看NavigationHelper这个类的代码,这个类里注册了HardwareButtons.BackPressed事件,是放在Windows Phone的条件编译里:

///
<summary>

/// Invoked when the hardware back button is pressed. For Windows Phone only.

///
</summary>

///
<param name="sender">Instance that triggered the event.</param>

///
<param name="e">Event data describing the conditions that led to the event.</param>

private
void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)

{

if (this.GoBackCommand.CanExecute(null))

{

e.Handled = true;

this.GoBackCommand.Execute(null);

}

}

原因找到了,虽然我在页面里手动处理了HardwareButtons.BackPressed事件,但因为NavigationHelper
仍然在起作用,因此仍然执行了GoBackCommand,于是又后退了。

那么修改一下,只有当e.Handled为false的时候再让NavigationHelper起作用吧:

private
void HardwareButtons_BackPressed(object sender, Windows.Phone.UI.Input.BackPressedEventArgs e)

{

if (this.GoBackCommand.CanExecute(null) && !e.Handled)

{

e.Handled = true;

this.GoBackCommand.Execute(null);

}

}

当执行到这里时,因为我们之前已经手动让e.Handled为true了,所以这里就不执行了,达到了显示评论列表的时候点击后退键隐藏列表而不是返回上一页的目的。

Windows Phone 8.1中处理后退键的HardwareButtons.BackPressed事件的更多相关文章

  1. 安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

    安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

  2. android中的后退键——onBackPressed()的使用

    转自:http://blog.sina.com.cn/s/blog_5085156c0101725e.html 很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键 ...

  3. react-router 中的history(react中关于后退键的处理用的到)

    react-router 中的history react-router 是建立在history之上的:我们来谈谈这个history吧. github: mjackson/history history ...

  4. 自己写方法处理WP(RT)后退键事件处理

    不用微软的NavigationHelper,自己写方法处理WP后退键事件 在WP8.1(RT)程序中,你会发现按下后退键时,应用会直接退出,变为后台运行,这是因为RT与Silverlight对后退键的 ...

  5. WP开发笔记——阻止Back后退键

    WP7中如何阻止Back后退键的后退事件呢? WP7上提供了物理的Back按键,获取Back物理键按下可以通过PhoneApplicationPage的BackKeyPress事件. 具体实现方法如下 ...

  6. Windows 10 版本 1507 中的新 AppLocker 功能

    要查看 Windows 10 版本信息,使用[运行]> dxdiag  回车 下表包含 Windows 10 的初始版本(版本 1507)中包括的一些新的和更新的功能以及对版本 1511 的 W ...

  7. 按后退键退出Android程序

    主要的目的是按后退键的时候,让程序能够退出. 实现起来的思路: 1.捕获后退键被按了这个事件. Java代码  @Override public boolean onKeyDown(int keyCo ...

  8. 处理 Windows Phone 应用中的“后退”按钮 (XAML)

    与电脑不同,所有 Windows Phone 设备都有“后退”按钮,它允许用户在应用的页面之间向后导航.如果用户在转到应用的第一页时再次按“后退”按钮,操作系统会挂起你的应用并将用户导航到应用启动前的 ...

  9. 【Win10开发】处理PC上的后退键

    我们知道在win10手机上和平板上都会有后退键,那么PC上该怎么办呢?没关系我们慢慢揭晓. 如果你已经是UWP的忠实用户,那么肯定会见到如下的后退键. 那么我们如何来做出来呢?, 我们首先打开App. ...

随机推荐

  1. 团队项目——站立会议DAY14

    第十四次站立会议记录: 参会人员:张靖颜,钟灵毓秀,何玥,赵莹,王梓萱 项目进展: 1.张靖颜:修改页面,查漏补缺.进行需求分析,监督每个组员,把大家的问题都一一梳理. 2.钟灵毓秀:继续修改模块代码 ...

  2. git 合并分支

    当前git有PreRelease和Release两个分支,现在需要将前者合并到后者. Clone版本 在本地clone一个目标工程. 然后右键 Tortoise-->Switch/Checkou ...

  3. git版本管理策略及相关技巧(A)

    公司几乎所有的项目都是使用 git 仓库来管理代码,以前对 git 只有些肤浅的了解,每次提交代码或者上线的时候总是会提心吊胆,生怕出现一些未知的问题.经过三个月的踩坑和填坑, git 操作颇显成熟. ...

  4. [异常解决] ubuntu上安采用sudo启动的firefox,ibus输入法失效问题解决

    采用sudo启动的应用是root权限的应用, ibus失效是因为ibus的初始配置采用user权限: 而root下运行的firefox输入法的配置还是停留在默认情况~ 解决方案是在shell下以roo ...

  5. 让C#轻松实现读写锁分离--封装ReaderWriterLockSlim

    ReaderWriterLockSlim 类 表示用于管理资源访问的锁定状态,可实现多线程读取或进行独占式写入访问. 使用 ReaderWriterLockSlim 来保护由多个线程读取但每次只采用一 ...

  6. XSS危害——session劫持

    在跨站脚本攻击XSS中简单介绍了XSS的原理及一个利用XSS盗取存在cookie中用户名和密码的小例子,有些同学看了后会说这有什么大不了的,哪里有人会明文往cookie里存用户名和密码.今天我们就介绍 ...

  7. 移动APP的自动化测试

    开发移动应用,最耗时耗力的就是手动测试APP的每个功能点或修复bug.有人就会提议App的业务逻辑可以使用nUnit或xUnit测试单元来辅助完成.那用户界面要如何测试?众所周知,移动设备多种多样,数 ...

  8. Java-集合练习题1

    第一题 (Map)利用Map,完成下面的功能: 从命令行读入一个字符串,表示一个年份,输出该年的世界杯冠军是哪支球队.如果该 年没有举办世界杯,则输出:没有举办世界杯. 附:世界杯冠军以及对应的夺冠年 ...

  9. Atitit 知识图谱的数据来源

    Atitit 知识图谱的数据来源   2. 知识图谱的数据来源1 a) 百科类数据2 b) 结构化数据3 c) 半结构化数据挖掘AVP (垂直站点爬虫)3 d) 通过搜索日志(query record ...

  10. fir.im Weekly - 聊聊让人向往的远程开发工作

    6月30 日,苹果开发者后台贴出一封关于广电总局的醒目通知,申报一个游戏 APP 上架AppStore,你需要文网文+ICP证+软著+版号,审批难度将越来越大,不禁让人感慨中国独立开发者的成长 &qu ...