如果我的应用程序被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"]);
}
}
我使用此代码获得异常:
ApplicationData.Current.LocalSettings.Values["CurrentPageType"] = this.GetType();
ApplicationData.Current.LocalSettings.Values["CurrentPageParam"] = args.Parameter;
mscorlib.dll中出现“System.Exception”类型的异常,但未在用户代码中处理 WinRT信息:尝试序列化要写入应用程序数据存储的值时出错 附加信息:不支持此类型的数据。 如果存在此异常的处理程序,则可以安全地继续该程序。
如果我将“.ToString()”追加到GetType()的调用中,它就不会爆炸......
答案 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
实现。但是,在每个页面中,您只需要填写LoadState
和SaveState
方法的正文 - 将您要保留的内容放入pageState
参数中。 它会持续显示用户所在的页面,而无需您执行任何操作 - 您只需添加要保存(和还原)的任何其他数据。
pageState
存储在应用程序目录中的文件中(与使用“设置”相对)。如果您使用Settings手动,则必须确保所有内容都是Windows运行时类型(主要是简单类型和数组),但使用pageState也可以序列化对象。
查看示例演练Manage app lifecycle and state以获取更多实际代码 解释