0

让我们考虑一个两页的 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 中的行为发生了变化,我们不能再使用这种方法?

4

1 回答 1

0

查询字符串行为从 WP7 到 WP8 没有改变。如果它在 uri 中,它将在从墓碑恢复或快速应用程序切换时停留在那里。

我用来区分的一种方法是使用NavigationEventArgs.IsNavigationInitiator 属性。true只有在您的应用程序内部导航以及false从操作系统恢复时才会出现这种情况。因此,如果您要将第一个 if 语句更改为以下内容,那么它可能会按您的预期工作:

if (e.IsNavigationInitiator 
      && this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam))
于 2014-04-14T15:22:34.293 回答