【问题标题】:How can I navigate back to the previous page in the OnLaunched() event?如何在 OnLaunched() 事件中导航回上一页?
【发布时间】:2012-11-30 08:11:28
【问题描述】:

如果我的应用程序被 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() 的调用中,它不会崩溃...

【问题讨论】:

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


    【解决方案1】:

    当然!当您覆盖 OnNavigatedTo 时,您需要坚持两件事:

    1) 当前类的类型,例如:

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

    2) 传递给当前页面的参数,类似于:

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

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

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

    然后就是这样:

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

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

    【讨论】:

    • 通过“检查空值......”我认为您的意思是那些 CurrentPageParams 将为空的情况,因为并非我的所有页面都发送了参数(有些是,有些不是)。当然,在每一页中,我都会知道它是否需要一个参数;如果没有,我应该分配什么 CurrentPageParams 键?
    • GetType() 抛出异常。我在上面的更新 2 中添加了详细信息。
    【解决方案2】:

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

    【讨论】:

    • Martin,Suchan 很棒的家伙。
    【解决方案3】:

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

    如果您正在使用 C#/XAML Grid 或 Split 模板,或者向项目添加除空白页以外的任何内容,您将引入 SuspensionManager 'helper' 类,该类为您设置了大部分管道.

    每个非空白页面都扩展了LayoutAwarePage,它提供了一个OnNavigatedTo 实现,就像Jerry 提到的那样。但是,在每个页面中,您只需要填写 LoadStateSaveState 方法的主体 - 将您想要保留的任何内容放入 pageState 参数中。 它会保留用户所在的页面,而无需您执行任何操作 - 您只需添加要保存(和恢复)的任何其他数据。

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

    查看示例演练Manage app lifecycle and state 以获取一些真实代码并进一步了解 解释。

    【讨论】:

    • 我确实从一个“空白”项目开始,所以没有 SuspensionManager/LayoutAwarePage 的东西。我也试过了,但决定“最小化”......我们拭目以待 - 也许我最终会改回来......
    • 如果您将“非空白”页面添加到现有基础架构,您将获得您需要为您添加的大部分内容 - 演练实际上是以 IIRC 的方式完成的。这可能只是简单地将现有页面更改为从 LayoutAwarePage 而不是 Page 继承的问题。
    猜你喜欢
    • 2016-07-12
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-05
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多