【问题标题】:How can I remove pages from a Frame's history?如何从 Frame 的历史记录中删除页面?
【发布时间】:2012-06-30 23:55:41
【问题描述】:

如何在 WinRT XAML 应用程序中操作 Frame 的历史记录?

用户将从我的中心页面开始,他们可以在其中选择现有项目以进入其编辑屏幕,也可以选择“新项目”。 “新建项目”将引导他们通过一个简短的向导,然后将他们带到“编辑项目”屏幕。

向导页面只是我在框架中导航到的页面是有意义的;这样,如果用户改变主意,就可以退出向导。 (它只有两页,所以“返回”可以代替“取消”。)但是一旦向导完成并提交了更改,这些向导页面就没有任何理由出现在历史记录中了。如果用户从“编辑项目”页面单击返回,我希望他们直接返回中心。

为了说明,我希望流程看起来像这样:

  • 帧历史:集线器。 用户点击“新建项目”。
  • 帧历史记录:Hub -> 向导页面 1。用户单击“下一步”。
  • 帧历史记录:Hub -> 向导页面 1 -> 向导页面 2。用户单击“完成”。
  • 帧历史记录:中心 -> 编辑项目。

Frame 似乎没有任何类似于“从历史中删除”的方法。文档确实暗示可能有某种方法可以覆盖历史记录,因为 GoBack 的文档说“导航到后退导航历史记录中的最新项目,如果框架管理自己的导航历史记录”(强调我的),但这就是关于这个话题的全部内容——没有提到其他人如何为它管理历史。所以我不知道这是否有用。

用户完成向导后,如何从 Frame 的历史记录中删除我的向导页面?

【问题讨论】:

  • 我遇到了同样的问题 Joe,我想我们可能必须将 Frame 包装在自定义 NavigationService 类中,并自己维护历史堆栈。 (并将 Frame 的 BackStackDepth 设置为零 - 这样它就不会)
  • @Krishna,NavigationService 甚至存在于 WinRT 中吗?我在文档中找不到它,如果我在代码中输入类名,VS 不会提示我添加适当的 using
  • 对不起 - 我应该更清楚一点。我提到了一个 custom NavigationService,就像这个答案中显示的那样:stackoverflow.com/questions/10971023/… - 类似的东西可以扩展到包括导航历史。

标签: frame windows-runtime winrt-xaml


【解决方案1】:

您可以通过在框架上调用 SetNavigationState(string navigationState) 从历史记录中删除页面。不幸的是,序列化的 navigationState 的格式是“仅供内部使用”,因此仅更改字符串可能会在将来的版本中破坏您的代码。

我只能想到一种未来证明方法来完全清除导航堆栈:

  1. 在程序启动时,通过调用 GetNavigationState 保存空导航状态。
  2. 在为您的编辑项目页面调用 Navigate 之前,调用 SetNavigationState 并使用空导航状态。

您的编辑项目页面现在将成为堆栈中的第一页。

【讨论】:

  • 是的,这是我考虑过的一个想法。实际上,我最终重新考虑了我的 UI 并完全摆脱了页面导航,而是以 MVVM 方式换掉了 UI,并用一个横向滚动页面替换了向导;我认为最终的结果是我们的 Metro^H^H^H^H^H Windows 应用商店,而不是一个向导。但我认为这将是我最初提出的问题的一个很好的答案。
  • @JoeWhite,嗨,我想知道你如何以 MVVM 方式换掉 UI。我偶然发现了类似的问题,想向你学习。
  • @imgen,看看这个视频:"Build Your Own MVVM Framework"。关于从视图模型驱动 UI 的好东西,包括导航。你也可以查看Caliburn.Micro,这是他在演讲之后写的 MVVM 框架;最新版本(昨天发布!)应该支持 WinRT。
【解决方案2】:

从 Windows 8.1 开始,您可以访问 Frame 的 BackStack 属性。您可以轻松删除一些内容或清除整个后台堆栈。

这是我正在使用的清除后台堆栈:

var rootFrame   = (Window.Current.Content as Frame);
rootFrame.Navigate(typeof(MyPage));
rootFrame.BackStack.Clear();

【讨论】:

    【解决方案3】:

    这对我来说是一个解决方案:

    while (ContentFrame.BackStack.Count > 1)
                {
                  ContentFrame.BackStack.Remove(ContentFrame.BackStack.ElementAt(ContentFrame.BackStack.Count-1));
    
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 2019-08-06
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      相关资源
      最近更新 更多