当应用程序从Tombstone恢复时,如何防止导航?

时间:2012-03-26 23:30:08

标签: windows-phone-7

我有一个应用程序,当应用程序被逻辑删除时,我想在其主屏幕上再次以“新”状态重新启动应用程序。

但默认情况下,wp7框架希望将您导航回到您停止的任何页面。

你如何阻止这种行为?

2 个答案:

答案 0 :(得分:2)

呃,这就是我想出来的,就像Shahar说的那样,它是hacky(但确实有效):

在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)

你无法真正做到这一点,而不是一些非常大的黑客。这是我个人认为这样做的唯一方法 - 可能还有其他方式。

  1. 从tombstone返回时,您将获得ApplicationActivated事件。存储一些记住它的变量。此外,重置您的全局状态。

  2. 使用NavigationService.RemoveBackEntry,直至到达第一页。

  3. 如果您可以“重置”主页面的状态,请执行此操作。否则,在您的MainPage中,在OnNavigateTo中,如果您设置为记住刚回来的静态变量为true,请使用NavigationService.Navigate()方法再次转到应用程序的第一页。您现在在堆栈中有两个“第一”页面。第一个是“脏”,第二个是“新”。

  4. 重置全局变量,告诉您刚刚从停用状态返回,但是有第二个全局变量,告诉您如果按下后退,应用程序会崩溃。

  5. 挂钩BackKey事件并终止应用程序(抛出一些例外)。

  6. 我强烈建议你重新考虑你的应用程序流程 - 这是一个非常糟糕的魔力。