在Windows 8 App中弹出导航堆栈页面

时间:2012-12-26 22:31:05

标签: c# .net windows-8 microsoft-metro

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

我尝试使用GetNavigationStack,但由于无法序列化而导致失败,因此我作为NavigationParameter传递了对象。我不得不使用一个元组来传递2个参数,但这不能被序列化,因此我无法让导航堆栈进行编辑并手动删除页面。

然后我找到了这个WinRT - How to ignore or delete page from navigation history并认为我可以包含一个布尔值,如果要跳过该页面可以设置

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

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

由于

5 个答案:

答案 0 :(得分: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()实际上会使页面与前一个页面相同,但它不会

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

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