我正在学习开发windowsphone应用程序。我从一个基于浏览器的应用程序开始,遵循本教程-http://blogs.msdn.com/b/jaimer/archive/2011/02/04/back-button-press-when-using-webbrowser-control-in-wp7.aspx.我正在试验http://m.facebook.com我可以正确地使用后退按钮转到上一页和所有这些东西,但我无法在双击后退按钮时实现退出。
我见过许多浏览器应用程序在双击后退按钮后退出。例如-Flipkart-http://www.windowsphone.com/en-us/store/app/flipkart/84fc03ea-210d-4e3e-88e0-de502a2434c5
后退按钮没有双标签事件。我们如何才能做到这一点?
您可以创建一个全局long
,表示用户上次按下后退按钮的时间。每次按下后退按钮,您都可以使程序减去经过的刻度数。如果它通过了一小段时间,你可以让你的程序退出。如果没有,请再次设置最后一个刻度变量。
您可以使用System.DateTime.Ticks
获取表示当前时间的当前刻度。
简单代码示例:
long LastExitAttemptTick = DateTime.Ticks;
private void BackButtonPressHandler(...)
{
long thisTick = DateTime.Ticks;
if (LastExitAttemptTick - thisTick < [specified amount])
throw new Exception("Exit Exception"); //You can use XNA, but this is a quick and dirty way of exiting
else
LastExitAttemptTick = DateTime.Ticks;
}
可以使用10000000个刻度(1秒)的值。MSDN说每毫秒有10000个滴答声,所以10000*1000=10000000。
编辑:或者,正如您所说,您也可以使用DateTime.Now
并使用秒值。无论哪种方式都有效。
这种逻辑可以适用于
生成全局变量
int Count=0
protected ovverride void OnBackKeyPress(CancelEventArgs e)
{
if(Count==0)
{
e.Canel=true;
Count++;
}
else if(Count==1)
{
Count=0;
//code for exiting
//may be App.Current.Terminate(); in wp8
//or in wp7
//if (NavigationService.CanGoBack)
//{
// while (NavigationService.RemoveBackEntry() != null)
// {
// NavigationService.RemoveBackEntry();
// }
//}
}
}
希望这能帮助
要在双击时关闭应用程序,可以使用DispatcherTimer
任务检查两次单击是否在一秒内,如果是,则关闭应用程序或启动timer
,然后再次检查。其片段如下:
将DispatcherTimer
对象作为类字段,如
DispatcherTimer dt = new DispatcherTimer();
在class's constructor
中,指定要检查双击的interval
,并添加event handler
以在指定时间过后执行某些操作。你可以在class's constructor
,
dt.Interval = TimeSpan.FromSeconds(1.0);
dt.Tick += delegate(object s, EventArgs e)
{
dt.Stop();
};
在这里,我们要做的是指定1秒的timespan
,以检查在这一秒内是否发生双击。Tick事件是当计时器完成1秒时我们想要做的事情。我们只是要停止timer
。
现在导航到返回键事件处理程序,下面是我要检查双击的代码:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
e.Cancel = true;
if (!dt.IsEnabled)
dt.Start();
else
new Microsoft.Xna.Framework.Game().Exit();
}
当第一次点击时,timer
未启动,它将进入if条件并启动计时器。如果第二次敲击发生在1秒之后,那么我们在构造函数中写入的Tick
事件将触发,并且根据写入的逻辑,timer
将停止。
现在假设双击因此在1秒内发生。对于第一次点击,它将像往常一样启动timer
,如果用户立即再次按下后退按钮,则在其处理程序中,它将检查timer
是否正在运行。由于timer
尚未完成其1秒间隔,否则条件将被激发,应用程序将关闭。
我使用XNA library
/shortcut来强制关闭应用程序。要使用new Microsoft.Xna.Framework.Game().Exit();
方法,您应该在引用中添加microsoft.xna.framework.game.dll
。
根据需要设置TimeSpan
间隔。
希望这能有所帮助。谢谢
EDIT:
有时XNA没有安装在windows 8上。这里有一个解决方案,以便您在项目中添加上面提到的程序集引用。
http://blogs.msdn.com/b/astebner/archive/2012/02/29/10274694.aspx
你必须下载大约23MB的更新。
为了节省时间,这里有一个Dropbox链接到上面的组装参考:
https://db.tt/RYTwv7cS
是的,后退按钮没有双击事件。您必须编写自己的逻辑才能在双击设备上退出应用程序。以下是可能对您有所帮助的解决方案。
创建全局变量并使用零进行初始化
Int TapCount=0;
现在用您自己的逻辑覆盖OnBackKeyPress事件。
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
TapCount++;
if(TapCount==2)
{
if( windows phone 8 )
{
Application.Current.Terminate();
}
else
{
if (NavigationService.CanGoBack)
{
while (NavigationService.RemoveBackEntry() != null)
{
NavigationService.RemoveBackEntry();
}
}
}
}
else
e.Canel=true;
base.OnBackKeyPress(e);
}
它非常简单。我是这样实现的:
首先声明全局变量:
int count;
现在在OnNavigatedTo(NavigationEventArgs e)方法中初始化其值:
count = 0;
现在,最后将以下代码添加到您的cs文件中:
protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
count++;
e.Cancel = true;
if(count == 2)
{ e.Cancel = false; base.OnBackKeyPress(e); }
}