2012-03-26 82 views
2

我有一個應用程序,當該應用程序是墓碑時,我想重新啓動應用程序在它的主屏幕上的「新」狀態。如何防止應用程序從墓碑中恢復導航?

但是默認情況下,wp7框架希望將您導航回您停留的任何頁面。

你如何阻止這種行爲?

+0

我要重新啓動的主頁上的應用。不是3頁深或者是離開 – Arash 2012-03-26 23:58:27

+0

無論在從墓碑回來,你可以瀏覽到您的主屏幕,並從返回堆棧中取出的第一個屏幕。我認爲這是可能的。 – 2012-03-27 02:25:37

回答

2

嗯,這是我想出了,像沙哈爾說,這是哈克(但不工作):

在App.xaml.cs

bool hasLaunched; 

    private void Application_Launching(object sender, LaunchingEventArgs e) 
    { 
     hasLaunched = true; 
    } 

    private void Application_Activated(object sender, ActivatedEventArgs e) 
    { 
     if (!hasLaunched) // recovering from a tombstone 
      GlobalNavigationService.ToMainPage(); 
     hasLaunched = true; 
    } 

在GlobalNavigationService類:

public static async void ToMainPage() 
    { 
     //CurrentFrame.StopLoading(); 
     await Observable.FromEventPattern<NavigationEventArgs>(CurrentFrame, "Navigated").Take(1).ToTask(); 

     SafelyNavigateTo("/ZuneSlotMachine;component/Views/Main/MainPage.xaml"); 

     await Observable.FromEventPattern<NavigationEventArgs>(CurrentFrame, "Navigated").Take(1).ToTask(); 

     while (CurrentFrame.BackStack.Count() > 0) 
      CurrentFrame.RemoveBackEntry(); 
    } 

基本上,等待第一個導航的情況發生,這似乎並不甚至通過調用CurrentFrame.StopLoading要撤銷的()。第一次導航後,它導航到我的起始頁面。該導航完成後,它會從後臺堆棧中刪除所有條目。

它的工作原理,但是有一個明顯的 - 從墓碑返回時(1 2秒)的延遲。

1

你不能真正做到這一點沒有一些非常大的黑客。這是我個人認爲這樣做的唯一方法 - 可能還有其他方法。

  1. 當從墓碑回來時,您將得到一個ApplicationActivated事件。存儲一些可以記住的變量。此外,重置您的全球狀態。

  2. 使用NavigationService.RemoveBackEntry直到您到達您的第一頁。

  3. 如果您可以「重置」主頁面的狀態,那就這樣做。否則,從您的MainPage中,在OnNavigateTo中,如果您設置爲記住剛剛返回的靜態變量爲true,則使用NavigationService.Navigate()方法再次轉到應用程序的第一頁。你現在在你的堆棧中有兩個「第一」頁面。第一個將是「骯髒」,第二個將是「新」。

  4. 重置全局變量,告訴你,你剛剛從失活回來,但有第二個全局變量,它告訴你,如果被壓回崩潰的應用程序。

  5. 掛鉤BackKey事件並殺死應用程序(拋出一些異常)。

我高度推薦您重新考慮您的應用程序流 - 這是一些非常糟糕的魔咒。

相關問題