Windows手机 - 双击如何退出?

时间:2013-12-15 03:13:52

标签: windows-phone-7 windows-phone-8

我正在学习开发Windows Phone应用程序。我按照本教程开始使用基于浏览器的应用程序 - 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

后退按钮没有双标签事件。我们怎样才能做到这一点?

5 个答案:

答案 0 :(得分:1)

您可以创建一个全局long,表示用户上次按下后退按钮的时间。 每次按下后退按钮,您都可以使程序减去经过的刻度数。如果它已经通过了少量滴答,您可以退出程序。如果没有,再次设置最后一个tick变量。

您可以使用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;
}

您可以使用10,000,000个刻度(1秒)的值。 MSDN表示每毫秒10,000个滴答,因此10,000 * 1000 = 10,000,000。

编辑:或者如您所说,您也可以使用DateTime.Now并使用秒值。无论哪种方式都有效。

答案 1 :(得分:0)

这种逻辑可以为你效用

制作全局变量

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();
            //    }
             //}
             }
            }

希望这有帮助

答案 2 :(得分:0)

要在双击上关闭应用程序,您可以使用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 /快捷方式强制关闭应用程序。要使用new Microsoft.Xna.Framework.Game().Exit();方法,您应在参考中添加 microsoft.xna.framework.game.dll

根据需要设置 TimeSpan 区间。

希望这会有所帮助。感谢。

<强> EDIT:

有时在Windows 8上没有安装XNA。这是一个解决方案,以便在项目中添加上面提到的程序集引用。

http://blogs.msdn.com/b/astebner/archive/2012/02/29/10274694.aspx

您必须下载大约23MB左右的更新。

为了节省时间,这是一个Dropbox链接到上面的程序集参考:

https://db.tt/RYTwv7cS

答案 3 :(得分:0)

是的,后退按钮没有双击事件。您必须编写自己的逻辑,以便在设备返回键两次点击双击时退出应用程序。以下是可能对您有帮助的解决方案。

创建一个全局变量并初始化为零

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);
        }

答案 4 :(得分:0)

这非常简单。我已经像这样实现了它:

首先声明全局变量:

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); } }