在页面之间导航时,我发现有一些功能可让您返回/转发或返回“主页”页面。但是,我需要的是能够返回但跳过用户不应再访问的页面。我四处搜索,发现了以下内容: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
对象(我认为)不能访问实际的页面对象,而是一些摘要对象,而我不知道如何将此布尔值转换为摘要对象。
有没有人知道从导航堆栈中删除上一页/当前页面的简单方法?这似乎是一个非常普遍的问题,所以我很难想到微软没有给我们一些方法。
由于
答案 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中,并清除之前的页面。