【问题标题】:NavigationContext.QueryString isn't cleared after tombstoning in WP8 Silverlight page appNavigationContext.QueryString 在 WP8 Silverlight 页面应用程序中墓碑化后未清除
【发布时间】:2014-04-09 14:36:40
【问题描述】:

让我们考虑一个两页的 Silverlight WP 应用程序:主页面 PageA,另一个 PageB 我们可以从 PageA 打开并向其中传递一个参数。正如 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 中的行为发生了变化,我们不能再使用这种方法?

【问题讨论】:

    标签: silverlight windows-phone-8 navigation query-string tombstoning


    【解决方案1】:

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

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

    if (e.IsNavigationInitiator 
          && this.NavigationContext.QueryString.TryGetValue("ItemIndex", out myParam))
    

    【讨论】:

    • 我同意这可用于区分应用重新激活和内部应用导航。在我的应用程序中,我使用了等效的解决方案,而是分析NavigationEventArgs.NavigationMode:如果我们从应用程序打开页面,则为New,如果从操作系统返回,则为Back。但我问题中的关键词是“墓碑”——你的食谱不允许我判断是不是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多