如何导航回OnLaunched()事件中的上一页?

时间:2012-11-27 21:55:28

标签: c# windows-8 lifecycle windows-store-apps terminate

如果我的应用程序被Windows终止(例如,如果它已被暂停,但Windows需要释放内存以便它抢占我的应用程序),当它重新启动时,会发生OnLaunched()事件并且我可以测试是否它被终止(或者用户只是关闭它):

    . . .
        if ((args.PreviousExecutionState == ApplicationExecutionState.Terminated) ||
            (args.PreviousExecutionState == ApplicationExecutionState.ClosedByUser))
        {
        }
    . . .

如果终止,我想继续前一个位置/页面,而不是在初始页面(如果不同)。我怎样才能做到这一点?伪代码可能是:

if (CurrentPage != LastSavedPage)
{
    CurrentPage = LastSavedPage;
    // or: Frame.Navigate(typeof(LastSavedPage)
}

更新

所以这是我对自己应该做的事情的看法,但我仍然“怀疑它”(见评论及其后的代码)

// OnNavigateTo in each page:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParam"] = args.Parameter; 
//Will the line directly above work even if args.Parameter is empty, or must I do something like:
if (null != args.Parameters)
{
     Settings.Values["CurrentPageParam"] = args.Parameter; 
}

//OnLaunched in app.xaml.cs
                if (args.PreviousExecutionState == ApplicationExecutionState.Terminated)
                {
                    if ((localSettings.Values.ContainsKey("CurrentPageType")) &&
                        (localSettings.Values.ContainsKey("CurrentPageParam")))
                    {
                        rootFrame.Navigate((Type)localSettings.Values["CurrentPageType"],
                                                                     localSettings.Values["CurrentPageParam"]);
                    }
                }

更新2

我使用此代码获得异常:

    ApplicationData.Current.LocalSettings.Values["CurrentPageType"] = this.GetType();
    ApplicationData.Current.LocalSettings.Values["CurrentPageParam"] = args.Parameter;

mscorlib.dll中出现“System.Exception”类型的异常,但未在用户代码中处理 WinRT信息:尝试序列化要写入应用程序数据存储的值时出错 附加信息:不支持此类型的数据。 如果存在此异常的处理程序,则可以安全地继续该程序。

如果我将“.ToString()”追加到GetType()的调用中,它就不会爆炸......

3 个答案:

答案 0 :(得分:1)

只需记住应用暂停时最后一页的类型,并在新开始后导航到App类中的正确页面。这应该不难实现。

答案 1 :(得分:1)

当然!当你重写OnNavigatedTo时,你需要坚持两件事:

1)当前类的类型,如:

Settings.Values["CurrentPageType"] = this.GetType();

2)params传递到当前页面,如:

Settings.Values["CurrentPageParams"] = e.Parameters;

第一个警告是您的参数必须是可序列化的。这取决于你。

第二个考虑因素是您的应用程序是否依赖于后台进行导航。如果是这样,那么你需要不仅仅保留当前页面的类型,而是它背后的面包屑。这也取决于你。

然后它就像是:

Frame.Navigate(
    (Type)Settings.Values["CurrentPageType"], 
    Settings.Values["CurrentPageParams"]);

请检查空值和类似的东西。但是,简而言之,就是这样。

答案 2 :(得分:1)

添加到其他答案(跳至TL; DR版本)...

如果您正在使用C#/ XAML网格或拆分模板或向项目添加除空白页之外的任何内容,那么您将进入SuspensionManager'帮助程序'类,该类设置了大部分管道对你而言。

每个非空白页面都延伸LayoutAwarePage,这提供了像Jerry所提到的OnNavigatedTo实现。但是,在每个页面中,您只需要填写LoadStateSaveState方法的正文 - 将您要保留的内容放入pageState参数中。 它会持续显示用户所在的页面,而无需您执行任何操作 - 您只需添加要保存(和还原)的任何其他数据。

pageState存储在应用程序目录中的文件中(与使用“设置”相对)。如果您使用Settings手动,则必须确保所有内容都是Windows运行时类型(主要是简单类型和数组),但使用pageState也可以序列化对象。

  

查看示例演练Manage app lifecycle and state以获取更多实际代码   解释