【发布时间】:2011-10-24 18:45:24
【问题描述】:
我有一个 Windows Phone 7.1 应用程序,其中包含三个页面,每个页面上都有 3 个按钮:第一个按钮指向第一个页面。 1,第二个导致页码。 2和第三导致页码。 3.
问题是,如果我转到第 1 页,然后转到第 2 页 - 然后如果我单击第一个按钮导航到第一页,则会创建该页面的新实例。我不想创建新实例,而是想从后台堆栈导航到页面的现有实例。
有可能吗?
【问题讨论】:
标签: windows-phone-7
我有一个 Windows Phone 7.1 应用程序,其中包含三个页面,每个页面上都有 3 个按钮:第一个按钮指向第一个页面。 1,第二个导致页码。 2和第三导致页码。 3.
问题是,如果我转到第 1 页,然后转到第 2 页 - 然后如果我单击第一个按钮导航到第一页,则会创建该页面的新实例。我不想创建新实例,而是想从后台堆栈导航到页面的现有实例。
有可能吗?
【问题讨论】:
标签: windows-phone-7
是的,您需要通过触发返回手动向后导航(主要相当于用户按下返回按钮):
NavigationService.GoBack();
这将利用操作系统维护的后台堆栈。它将弹出第 2 页并恢复第 1 页。请注意,您无法选择要返回的页面,如果有要返回的页面,则返回一页。因此,例如从第 3 页触发向后导航将带您到第 2 页,您不能选择第 1 页。
或者,但不建议,您可以在 7.1 中从后台堆栈弹出页面:
NavigationService.RemoveBackEntry();
然后您可以手动导航到该页面。但说真的,尽量不要这样做,因为它会破坏用户的期望,除非您自己管理页面支持。
【讨论】:
GoBack 在适当的地方这样做,它会从堆栈中弹出你来自的页面。在您的情况下,如果处理得当,您的堆栈最多应该只有 2 页大。此外,在页面之间切换的按钮也不符合用户的期望。如果用户在第 2 页并想进入第 1 页,他们非常很有可能会使用返回按钮。
But seriously, try not to do that as it breaks user expectations, unless you manage page backing yourself. 有疑问,在我的场景中,我有页面:MainMenu(带有产品)-> 设置-> ListOfStores -> StoreDetails(这里是用户可以确认选择的商店,这会触发 MainMenu 的更新)。如何在不使用非线性导航服务的情况下以“用户预期”的方式选择商店后返回主页?
您会更适合使用诸如 MVVM 之类的框架来控制您的数据,而不是依赖于页面的特定实例,但仍会记住用户在该页面上的位置。
MVVMLight 是一个不错的选择 - http://mvvmlight.codeplex.com/
然后,您只需要在应用内更好地控制导航,以决定应用应如何流动,而不是依赖于后台堆栈。 Back 只是根据用户的选择返回,而不是你的应用程序的流向(不要依赖它)。
删除 mango 中的返回条目等功能是解决用户导航回家的老问题的一种解决方法,并且您希望防止返回到应用流程中的无效点。
【讨论】:
您可以将NavigationService.Navigate(new Uri.. 与非线性导航服务结合使用。如果您已经在该页面上,这将为您执行 back.back.back。 http://create.msdn.com/en-us/education/catalog/article/nln-serv-wp7
【讨论】: