让我们考虑一个两页的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,则会出现一个问题。在这种情况下,OnNavigatedTo事件中的NavigationContext.QueryString
返回相同的ItemIndex参数,就像从PageA调用页面一样,第二个' if'永远不会被执行!
我是否遗漏了重要的内容(应用设置等),或者WP8中的行为发生了变化,我们无法再使用此方法了?
答案 0 :(得分:0)
查询字符串行为未从WP7更改为WP8。如果它在uri中,它会在从墓碑或快速应用程序切换恢复时保留在那里。
我使用一种方法来区分NavigationEventArgs.IsNavigationInitiator属性。只有在您的应用内导航时才会true
,而当您从操作系统恢复时,false
。因此,如果您要将第一个if语句更改为以下内容,那么它可能会按预期工作:
if (e.IsNavigationInitiator
&& this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam))