2012-03-26 68 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事件并杀死应用程序(抛出一些异常)。

我高度推荐您重新考虑您的应用程序流 - 这是一些非常糟糕的魔咒。

相关问题