弹出页面的导航堆栈在Windows 8应用程序

本文关键字:Windows 应用程序 堆栈 导航 | 更新日期: 2023-09-27 17:49:32

在页面之间导航时,我看到有一些功能可以让您返回/前进或返回"主页"。然而,我需要的是能够回去,但跳过页面,用户不应该能够访问任何更多。我搜索了一下,发现了以下内容: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对象不(我认为)可以访问实际的页面对象,而是一些摘要对象,我不知道如何将这个布尔值获取到该摘要对象中。

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

谢谢

弹出页面的导航堆栈在Windows 8应用程序

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

我刚刚调用了两次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()实际上会使页面动画到前一个,但它没有

Frame.BackStack.RemoveAt(Frame.BackStack.Count - 1);

虽然我必须给道具给gvmani,因为他的回答帮助,虽然它不是很完整。

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

我遇到了同样的问题,并通过在导航离开后从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);
}

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

public SamplePage()
    {
        this.InitializeComponent();
        this.NavigationCacheMode = global::Windows.UI.Xaml.Navigation.NavigationCacheMode.Required;
    }

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