2013-09-27 69 views
2

我的Toast通知有一個奇怪的問題(或者它可能是我誤解的行爲)。我想要的只是讓敬酒回到用戶點擊「開始」按鈕時所在的頁面。WP8 OnNavigated點擊吐司通知後觸發TWICE?

場景:

用戶打開應用程序,它們被示出的Page1.xaml。用戶點擊按鈕導航到Page2.xaml。從這裏開始,他們點擊開始按鈕。這裏是Toast通知我成立了Page2.xaml.cs:

Microsoft.Phone.Shell.ShellToast toast = new Microsoft.Phone.Shell.ShellToast(); 
toast.Content = "App is still running!"; 
toast.Title = AppResources.ApplicationTitle; 
toast.NavigationUri = new Uri("/Pages/Page2.xaml?fromToast=true", UriKind.Relative); 
toast.Show(); 

我的查詢字符串傳遞fromToast,這樣我可以處理「恢復」正常。但是,當我點擊顯示的Toast通知時,我的OnNavigatedTo事件會在Page2.xaml上觸發兩次。

第一次OnNavigatedTo點擊Toast後在Page2.xaml上觸發,沒有查詢字符串參數,但之後立刻用我的fromToast參數再次觸發。

爲什麼它會發射兩次?這是預期的嗎?如果我從我的toast中刪除NavigationUri屬性,點擊Toast只會將應用程序轉回Page1.xaml,這不是我想要的。

有沒有人見過這個?

回答

5

這是Fast Resume啓用時的正常行爲。你必須瞭解它是如何工作的,以決定你想如何處理用戶體驗。從MSDN網站:

有了快速恢復,當一個應用程序被恢復時,系統啓動點的目標創建一個新的頁面實例和這個頁面被放置在應用程序的現有堆棧中的頂部。

因此,基本上在烤麪包上點擊會導致創建一個新的Page2實例,因此NavigatedTo被調用時沒有查詢字符串。由於您的吐司具有深度鏈接,因此將請求另一個導航,從而導致創建Page2的另一個實例,並使用fromToast=true調用查詢字符串。

您可以通過檢查e.NavigationMode屬性來確定導航模式。第一次應該是NavigationMode.Reset,第二次應該是NavigationMode.New

另外請注意,默認情況下從吐司啓動應用程序將清除後臺堆棧,以便讓用戶進入無限循環的吐司。

如何快速恢復工作以及如何處理不同的情況很好看的是在這裏:Fast app resume for Windows Phone 8

我的建議是,你並不真的需要告訴應用程序仍在運行的用戶。這是WP中應用程序的默認行爲,大多數用戶已經知道這一點。

+1

+1不錯的信息:) – Anobik

+0

哇,謝謝你的信息。我對快速簡歷不是很熟悉,所以我一定會閱讀。 – lhan

0

要爲Alaa Masoud的答案增加一件事情,如果您爲Page2啓動了應用程序並帶有Toast,則導航URI爲「/Pages/Page2.xaml?fromToast=true」,如果您在此時再次暫停您的應用程序頁面(Page2)並使用Page2吐司進行啓動,相應的導航模式將爲重置和刷新。