2013-12-15 34 views
2

我正在學習開發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我可以正確使用返回按鈕去上一頁和所有的東西,但我不能實現雙擊後退按鈕退出。Windows手機 - 如何退出雙擊?

我看過很多瀏覽器應用程序,它們在雙擊後退按鈕後退出。例如 - Flipkart - http://www.windowsphone.com/en-us/store/app/flipkart/84fc03ea-210d-4e3e-88e0-de502a2434c5

後退按鈕沒有雙選項卡事件。我們怎樣才能做到這一點?

回答

1

您可以創建一個全球性的long表示最後一次用戶按下後退按鈕。 每次按下後退按鈕時,都可以讓程序減去已經過的滴答數。如果它已經通過了很短的時間,你可以退出程序。如果不是,請再次設置最後的tick變量。

您可以通過System.DateTime.Ticks獲得當前時間的當前時間刻度。

Simple代碼示例:

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並使用秒數值代替。無論哪種方式工作。

+0

在你說出來之前就做過了,沒有機會看到這裏。謝謝您花時間幫助我。你很近。蜱更大的價值。我結束了做DateTime.Now並計算毫秒差異。如果它小於500,我把它當作雙擊。請更新您的答案,我會標記它。 – Codie

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

希望這有助於

+0

看起來合乎邏輯但不起作用:( – Codie

+1

e.Cancel = true;應該只應用於if(Count == 0) - 部分。 –

+0

請嘗試編輯 –

0

結束對雙擊的應用程序,你可以使用DispatcherTimer任務檢查兩次點擊是否在一秒內,如果是,關閉應用程序,否則開始timer並再次檢查。該代碼段如下:

做出DispatcherTimer對象作爲類字段一樣,

DispatcherTimer dt = new DispatcherTimer(); 

在你class's constructor指定要檢查雙擊並添加event handler執行一些interval在指定時間已過時執行操作。您可以在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尚未啓動,它會去,如果條件並開始定時器。如果在1秒後出現第二次敲擊,則我們在構造函數中寫入的Tick事件將觸發,並根據寫入的邏輯,將停止timer

現在假設雙擊因此在1秒內發生。對於第一次點擊如往常一樣,它將啓動timer,如果用戶立即再次按下後退按鈕,則在其處理程序中,它將檢查timer是否正在運行。由於timer尚未完成其1秒的時間間隔,否則條件將啓動並且應用程序將關閉。

我用XNA library /快捷鍵到強行關閉該應用程序。要使用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

+0

很酷..但我不希望這個庫被不必要地添加。我用類似於安德魯的方法做了它。在那裏看到我的評論。但是非常感謝您的時間。 – Codie

+0

沒問題,很高興你的問題解決了:) – thegiga

0

是的,後退按鈕沒有雙擊事件。您必須編寫自己的邏輯,以雙擊設備後退鍵兩次退出應用程序。這可能是對你有幫助的解決方案。

創建一個全局變量,並用零

詮釋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); 
     } 
+0

'if(windows phone 8)'是什麼意思? – Xyroid

+0

這意味着如果你的應用程序運行在wp8環境中 – Jaihind

0

這很簡單。我實現這樣的:

首先聲明全局變量:

int count; 

現在初始化其的OnNavigatedTo(NavigationEventArgs E)值方法:

count = 0; 

現在,在最後添加下面的代碼到您的CSV文件:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) { count++; e.Cancel = true; if(count == 2) { e.Cancel = false; base.OnBackKeyPress(e); } }