【问题标题】:Navigate back without removing actual page from BackStack在不从 BackStack 中删除实际页面的情况下向后导航
【发布时间】:2015-02-05 16:26:11
【问题描述】:

我正在开发一个 WP 8 应用,但我遇到了导航问题。

我找不到在不丢失实际页面状态的情况下导航到后台堆栈上的页面的方法。

情况是这样的:

  1. 我在页面 A 并导航到页面 B,因此后退堆栈仅包含 A。
  2. 在页面 B 上,我想导航回页面 A,但页面 B 保留在后台堆栈中,因此当我再次在页面 A 上时,我可以返回页面 B 并保留它的状态。

就是这样:A --> B --> A --> B,这是一个循环,但它不是一个循环。页面 A 显示的项目也显示在页面 B 中,但细节较少,但从页面 B 我可以转到页面 A 查看详细信息,然后再返回。

它可能看起来很复杂,但我向你保证它非常直观 :) 它在 Android 和 iOS 上的工作原理就是这样。

是否有在页面 A 之前将页面 B 添加到导航堆栈,所以当我调用 NavigationService.GoBack() 时,它会返回到页面 A 并返回之前的状态,然后从 A 到 B 执行相同操作。

提前致谢!!!

【问题讨论】:

    标签: c# xaml windows-phone-8 windows-phone navigationservice


    【解决方案1】:

    有几个选项。如果您使用标准 MVVM 模式,那么您并没有真正保存“页面状态”(除非您的意思是列表中的滚动位置或选定的文本控件) - 您正在保存数据。下次您导航到页面 B 时,该数据将在那里。您可以观看 this videoMSDN article it points to 以获取有关数据绑定以及如何以全局状态存储将重新绑定到页面的数据的更多信息下次导航时。

    如果数据绑定不能解决问题,另一种选择是根本不使用不同的页面,而只是将 A 和 B 作为两个不同的容器放在同一个物理页面上。然后,当您需要切换回容器 A 时,您可以 trap the back button 假装“返回”。

    【讨论】:

    • 嗨!谢谢回复。第一个选项不起作用,因为在 WP 上,您要么放弃页面转到上一个页面,要么在导航时创建一个新页面继续前进。重新加载前一个页面的唯一方法是返回,而保存页面状态的唯一方法是前进。我需要回去保存状态,这是不可能的。至于第二种解决方案,这两个页面都增加了一些复杂性,并且无法以这种方式解决它。一开始是这样做的,但后来因为性能问题不得不分成两页。
    • 要么 UI 足够简单,可以同时在内存中保存两个“页面”(第二种解决方案,你说这是不可能的),或者你需要卸载 UI(这是第一个选项确实)。您是否点击了视频/文章的链接?数据绑定不受 UI 对象被销毁这一事实的影响。
    【解决方案2】:

    使用此帮助主题了解how to preserve and restore page state for Windows Phone 8。导航堆栈只能存储页面 URI 和少量数据(在 URI 参数中)。

    像这样:

    NavigationService.Navigate(new Uri("/SecondPage.xaml?var=value", UriKind.Relative));

    SecondPage.xaml 可以得到val 的值。这里是detailed example

     if (NavigationContext.QueryString.TryGetValue("val", out msg))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-15
      相关资源
      最近更新 更多