2012-12-26 38 views
7

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

我尝试使用GetNavigationStack,但由于无法序列化和对象作为NavigationParameter传递,因此它保持失败。我不得不使用Tuple传递2个参数,但是这不能被序列化,所以我无法让导航堆栈编辑它并手动删除页面。

然后我发现这个WinRT - How to ignore or delete page from navigation history,我想我可以包括可设置一个布尔值,如果页面被跳过

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

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

感谢

+1

试图手动编辑导航历史记录是一个坏主意。您可能只需导航一个,然后检查是否应该继续向后导航。 – mydogisbox

回答

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()实际上会使页面动画前一个,但它不

+0

导航足够快,不会注意到动画,但触发了loadstate事件(因此会执行逻辑)。 – Bart

+0

如果你知道你总是上升到两个级别,我想你可以跳过对GoBack()的调用,并将下面的代码添加到您在其加载状态方法中导航到的页面中:“if(Frame.BackStack。任何()){Frame.BackStack.Clear();}“ –

-1

如果您使用的是框架导航,请执行this.Frame.BackStack.Remove在新框架的装载状态并清除以前的页面需要的。

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

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

这样可以避免上面提到的LoadState事件被触发时出现的问题,这是一个更加优雅的解决方案。

2

我遇到了同样的问题,并从堆栈中删除当前页面解决了这个导航离去后:

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); 
} 
0

我已经使用NavigationCacheMode以避免多个实例创建,而导航到框架的其他页面。

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