【问题标题】:Pop pages off navigation stack in Windows 8 App在 Windows 8 应用程序中从导航堆栈弹出页面
【发布时间】:2012-12-26 22:31:05
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 尝试手动编辑导航历史是个坏主意。您可能只是向后导航,然后检查是否应该继续向后导航。

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


【解决方案1】:

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

我刚刚打电话给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() 实际上会使页面动画到前一个页面,但事实并非如此

【讨论】:

  • 导航速度足够快,不会注意到动画,但会触发 loadstate 事件(因此将执行那里的逻辑)。
  • 如果你知道你总是要上两层,我想你可以跳过对 GoBack() 的调用,并在你导航到的页面中添加以下代码在它的加载状态方法中: "如果 (Frame.BackStack.Any()) { Frame.BackStack.Clear(); }"
【解决方案2】:
Frame.BackStack.RemoveAt(Frame.BackStack.Count - 1);

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2013-04-21
          • 2018-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多