Windows10 如何在通用应用中修改当前页面的Frame参数

How to modify Frame parameter of current page in Universal app for Windows 10

Windows 10 的通用应用程序使用 Frame 导航不同的 Page。其中一些页面有参数,例如产品标识符,告诉他们要显示什么。此类参数传递给 Frame.Navigate().

有时我使用不完整的信息导航到页面。然后,我使用该信息查找 其他 信息,告诉我要显示的内容。我想用这些附加信息更新导航参数,以避免在用户向后或向前导航时重新进行查找。

我最初的想法是简单地在 FrameBackStack 顶部使用 PageStackEntry,大致如下:

IList<PageStackEntry> stack = frame.ForwardStack;
if (stack.Count > 0)
{
    PageStackEntry stackEntry = stack[stack.Count - 1];

    // PageStackEntry properties don't have setters, so create a new entry:
    stack[stack.Count - 1] = new PageStackEntry(
        stackEntry.SourcePageType,
        (my updated parameter goes here),
        stackEntry.NavigationTransitionInfo);
}

然而,BackStack 不包含当前页面。 (ForwardStack 也没有。)如果有任何 PageStackEntry 描述当前页面,我不知道它在哪里。

我唯一的其他想法是调用 GetNavigationState(),篡改生成的字符串( 包含当前页面状态的描述),然后调用SetNavigationState()。我犹豫要不要这样做,因为 the documentation 声明序列化格式是官方未定义的:

The serialization format used by these methods is for internal use only. Your app should not form any dependencies on it. Additionally, this format supports serialization only for basic types like string, char, numeric and GUID types.

序列化导航状态的示例如下所示(对于单个页面);找出格式的细节应该是可行的:

1,1,0,60,MyApp.UX.Pages.MyPage,12,34,{"Data":{"PrimaryParameter":"42"}},0

但是“您的应用程序不应对格式形成任何依赖性”听起来……至少可以说令人反感。我很乐意就此事提出任何想法和建议。

我不认为那样传递参数是一个很好的理想。有更多自适应方法可以解决这个问题,其中之一是创建一个参数 class 来保存数据,在导航时传递它,并在着陆页将其转换为正确的类型。