如何从Frame的历史记录中删除页面?

时间:2012-06-30 23:55:41

标签: frame windows-runtime winrt-xaml

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

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

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

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

  • 帧历史:Hub。 用户点击“新项目”。
  • 帧历史:Hub - >向导页面1. 用户点击“下一步”。
  • 帧历史:Hub - >向导第1页 - >向导页面2. 用户点击“完成”。
  • 帧历史:Hub - >编辑项目。

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

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

3 个答案:

答案 0 :(得分:6)

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

我只能想到将来 完全清除 导航堆栈的未来验证方法:

  1. 在程序启动时,通过调用GetNavigationState保存空导航状态。
  2. 在为“编辑项目”页面调用“导航”之前,使用空导航状态调用SetNavigationState。
  3. 您的“编辑项目”页面现在将成为堆栈中的第一页。

答案 1 :(得分:1)

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

以下是我使用清除后栈的原因:

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

答案 2 :(得分:0)

它是我的解决方案:

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

            }