7

在页面之间导航时,我看到有一些功能可以让您返回/前进或返回“主页”。但是,我需要的是能够返回但跳过用户不应再访问的页面。我四处搜索,发现以下内容:http ://social.msdn.microsoft.com/Forums/en-US/winappswithcsharp/thread/3819f389-3bfc-4c59-a919-272927fc9229

我尝试使用 GetNavigationStack,但由于无法序列化和我作为 NavigationParameter 传递的对象,它一直失败。我必须使用元组来传递 2 个参数,但这无法序列化,因此我无法让导航堆栈对其进行编辑并手动删除页面。

然后我找到了这个WinRT - 如何从导航历史记录中忽略或删除页面,并认为我可以包含一个布尔值,如果要跳过页面,可以设置该值

LayoutAwarePage.cs(所有屏幕继承自的类,由 Visual Studio 生成)中,我添加了protected bool CanGoBackToThisPage { get; set; }如果您不想访问此页面可以设置,但是这也存在问题,因为有时我不知道您是否想成为能够再次访问页面,直到您在当前页面上完成了某些操作。我不认为你可以做类似的事情previousFrame.CanGoBackToThisPage = true。此外,Frame您有权访问的对象(我认为)不能访问实际的页面对象,而是一些摘要对象,我不知道如何将这个布尔值放入该摘要对象中。

有谁知道从导航堆栈中删除上一个/当前页面的简单方法?这似乎是一个非常普遍的问题,所以我很难认为微软没有给我们一些方法来做到这一点。

谢谢

4

5 回答 5

5

好的,我不知道为什么在发布问题之前我没有想到它。也许我只是累了。

我只打Frame.GoBack()了两次电话,然后导航到我想去的页面:

// If the user presses back we don't want them to visit this page or the previous page they were on so remove them from the navigation stack
Frame.GoBack();
Frame.GoBack();

// Go to the detail page
this.Frame.Navigate(typeof(GroupDetailPage), mGroup);

我想我认为调用GoBack()实际上会使页面动画到前一个页面,但事实并非如此

于 2012-12-26T22:49:59.803 回答
3
Frame.BackStack.RemoveAt(Frame.BackStack.Count - 1);

尽管我必须向 gvmani 提供道具,因为他的回答有所帮助,尽管它不是很完整。

这将避免上面提到的触发 loadstate 事件的问题,是一种更优雅的解决方案。

于 2013-12-11T08:46:38.720 回答
2

我遇到了同样的问题,并通过在导航离开后从 BackStack 中删除当前页面解决了这个问题:

protected override void OnNavigatedFrom(NavigationEventArgs e)
{
  base.OnNavigatedFrom(e);

  // Remove current page from history
  var pageStackEntry = Frame.BackStack.Last(entry => entry.SourcePageType == this.GetType());
  Frame.BackStack.Remove(pageStackEntry);
}
于 2014-06-16T09:55:16.157 回答
0

我使用 NavigationCacheMode 来避免在导航到 Frame 中的其他页面时创建多个实例。

public SamplePage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = global::Windows.UI.Xaml.Navigation.NavigationCacheMode.Required;
    }
于 2014-09-30T05:58:46.153 回答
-1

如果您使用框架导航,请在新框架的加载状态中执行 this.Frame.BackStack.Remove 并清除之前的页面。

于 2013-11-20T07:03:29.270 回答