0

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

4

3 回答 3

1

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

于 2012-11-27T22:26:24.957 回答
1

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

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

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

2)传递给当前页面的参数,例如:

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

第一个警告是您的参数必须是可序列化的。随你(由你决定。

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

然后就是这样:

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

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

于 2012-11-27T22:49:40.430 回答
1

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

如果您使用 C#/XAML Grid 或 Split 模板,或者向项目添加除空白页以外的任何内容,您将引入SuspensionManager的“帮助器”类,它为您设置了大部分管道。

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

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

查看示例演练管理应用程序生命周期和状态以获取一些真实代码和进一步解释。

于 2012-11-28T01:58:21.197 回答