3

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

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

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

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

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

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

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

4

3 回答 3

6

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

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

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

现在,您的 Edit Project 页面将成为堆栈的第一页。

于 2012-10-09T11:11:08.140 回答
1

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

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

var rootFrame   = (Window.Current.Content as Frame);
rootFrame.Navigate(typeof(MyPage));
rootFrame.BackStack.Clear();
于 2015-03-23T14:34:44.180 回答
0

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

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

            }
于 2016-04-24T20:54:01.773 回答