让我们考虑一个两页的 Silverlight WP 应用程序:主页面 PageA,以及另一个可以从 PageA 打开并向其中传递参数的 PageB。正如 Charles Petzold 在他的畅销书“Programming WP7”中所建议的那样,我们可以使用如下语句来实例化 PageB:
NavigationService.Navigate(new Uri(
"/EditEntryPage.xaml?ItemIndex=" + myItemIndex, UriKind.Relative));
然后在PageB的OnNavigatedTo/OnNaviagetdFrom事件中使用如下构造处理参数和应用被墓碑重新激活时的情况:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
string myParam;
if (this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam))
{
fItemIndex = int.Parse(myParam);
}
else if (PhoneApplicationService.Current.State.ContainsKey(APP_STATE_KEY_ITEM_INDEX))
{
fItemIndex = (int)PhoneApplicationService.Current.State[APP_STATE_KEY_ITEM_INDEX];
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
PhoneApplicationService.Current.State[APP_STATE_KEY_ITEM_INDEX] = fItemIndex;
}
但是,如果用户从 PageB 离开应用程序,我们会遇到一个问题,该应用程序被删除,并且用户使用任务管理器再次返回到同一个 PageB 的应用程序。在这种情况下,NavigationContext.QueryString
在 OnNavigatedTo 事件中返回相同的 ItemIndex 参数,就好像页面是从 PageA 调用的,而第二个 'if' 永远不会执行!
我是否错过了一些重要的事情(应用程序设置等),或者 WP8 中的行为发生了变化,我们不能再使用这种方法?