C# 如何在OnLaunched()事件中导航回上一页?
如果我的应用程序被Windows终止(例如,如果它已被挂起,但Windows需要释放内存以便它抢占我的应用程序),当它重新启动时,将发生OnLaunched()事件,我可以测试它是否被终止(或用户只是关闭它): 如果终止,我希望在上一个位置/页面继续,而不是在初始页面(如果不同)。我该怎么做?伪代码可能是:C# 如何在OnLaunched()事件中导航回上一页?,c#,windows-8,lifecycle,windows-store-apps,terminate,C#,Windows 8,Lifecycle,Windows Store Apps,Terminate,如果我的应用程序被Windows终止(例如,如果它已被挂起,但Windows需要释放内存以便它抢占我的应用程序),当它重新启动时,将发生OnLaunched()事件,我可以测试它是否被终止(或用户只是关闭它): 如果终止,我希望在上一个位置/页面继续,而不是在初始页面(如果不同)。我该怎么做?伪代码可能是: if (CurrentPage != LastSavedPage) { CurrentPage = LastSavedPage; // or: Frame.Navigate(
if (CurrentPage != LastSavedPage)
{
CurrentPage = LastSavedPage;
// or: Frame.Navigate(typeof(LastSavedPage)
}
更新
所以这是我应该做的,但我仍然“对它有疑问”(见下面的注释和代码)
更新2
我得到一个与此代码有关的异常:
ApplicationData.Current.LocalSettings.Values["CurrentPageType"] = this.GetType();
ApplicationData.Current.LocalSettings.Values["CurrentPageParam"] = args.Parameter;
mscorlib.dll中发生“System.exception”类型的异常,但未在用户代码中处理
WinRT信息:尝试序列化要写入应用程序数据存储的值时出错
其他信息:不支持此类型的数据。
如果存在此异常的处理程序,则程序可以安全地继续
如果我在对GetType()的调用中附加“.ToString()”,它不会爆炸…只要记住应用程序挂起时打开的最后一页的类型,在新的开始后导航到应用程序类中的正确页。这应该不难实现。只要记住应用程序挂起时的最后一页类型,在新的开始后,导航到应用程序类中的正确页面即可。这应该不难实现。当然!当您覆盖OnNavigatedTo时,需要保留两件事: 1) 当前类的类型,类似于:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
2) 传递到当前页面的参数,类似于:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
第一个警告是,您的参数必须是可序列化的。这取决于你
第二个需要考虑的问题是,应用程序是否依赖backbackback进行导航。如果是这样的话,那么您需要保存的不仅仅是当前页面的类型,还包括页面后面的面包屑。这也取决于你
然后它就像:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
请检查空值之类的东西。但是,简而言之,就是这样。当然!当您覆盖OnNavigatedTo时,需要保留两件事: 1) 当前类的类型,类似于:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
2) 传递到当前页面的参数,类似于:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
第一个警告是,您的参数必须是可序列化的。这取决于你
第二个需要考虑的问题是,应用程序是否依赖backbackback进行导航。如果是这样的话,那么您需要保存的不仅仅是当前页面的类型,还包括页面后面的面包屑。这也取决于你
然后它就像:
Settings.Values["CurrentPageType"] = this.GetType();
Settings.Values["CurrentPageParams"] = e.Parameters;
Frame.Navigate(
(Type)Settings.Values["CurrentPageType"],
Settings.Values["CurrentPageParams"]);
请检查空值之类的东西。但是,太长了,读不下去了。< / P> < P>,把其他答案加起来(跳过到TL;DR版本)……p> 如果您正在使用C#/XAML网格或拆分模板,或者在项目中添加除空白页以外的任何内容,那么您将引入“helper”类,该类将为您设置大部分管道 每个非空白页面都扩展了
LayoutAwarePage
,它提供了一个类似Jerry提到的on导航到
实现。但是,在每个页面中,您只需要填写LoadState
和SaveState
方法的主体-将您想要保留的内容放入pageState
参数中并且它可以在用户不做任何操作的情况下保存用户所在的页面-您只需添加任何要保存(和恢复)的附加数据
pageState
存储在应用程序目录中的文件中(与使用设置相比)。如果使用手动设置,则必须确保所有内容都是Windows运行时类型(主要是简单类型和数组),但使用pageState也可以序列化对象
查看示例演练,了解一些真实的代码和更多信息
解释
太长了,读不下去了(添加到其他的答案(跳过到TL;DR版本)……p> 如果您正在使用C#/XAML网格或拆分模板,或者在项目中添加除空白页以外的任何内容,那么您将引入“helper”类,该类将为您设置大部分管道
每个非空白页面都扩展了LayoutAwarePage
,它提供了一个类似Jerry提到的on导航到
实现。但是,在每个页面中,您只需要填写LoadState
和SaveState
方法的主体-将您想要保留的内容放入pageState
参数中并且它可以在用户不做任何操作的情况下保存用户所在的页面-您只需添加任何要保存(和恢复)的附加数据
pageState
存储在应用程序目录中的文件中(与使用设置相比)。如果使用手动设置,则必须确保所有内容都是Windows运行时类型(主要是简单类型和数组),但使用pageState也可以序列化对象
查看示例演练,了解一些真实的代码和更多信息
解释
Martin,Suchan真棒的家伙。Martin,Suchan真棒的家伙。通过“检查空值…”我想你指的是当前页面参数将为空的情况,因为并非所有页面都发送了参数(有些是,有些不是)。当然,在每一页中,我都会知道它是否需要一个参数;如果没有,我应该如何分配CurrentPageParams键?GetType()会引发异常。我在上面的更新2中添加了详细信息。通过“检查空值…”,我认为您指的是CurrentPageParams将为空的情况,因为并非我的所有页面都是发送参数(有些是,有些不是)。当然,在每一页中,我都会知道它是否需要一个参数;如果没有,我应该如何分配CurrentPageParams键?GetType()会引发异常。我在上面的更新2中添加了详细信息。我确实是从一个“空白”项目开始的,所以没有SuspensionManager/LayoutWarePage之类的东西。我也试过了,但是