在Windows Phone 8中实现类似Tab的导航模型 – 如何?

我目前正在尝试实现与Windows Phone 8上的Internet Explorer应用程序非常相似的导航方案。

IE应用程序可以有多个用户可以在其间切换的选项卡。 每个选项卡都有自己的历史记录。 点击手机上的后退按钮可以转到该选项卡导航历史记录中的上一页(不是PhoneApplicationFrame.BackStack 。 如果没有以前的页面,后退按钮会将您带到上一个打开的选项卡,如果没有,则退出应用程序。

为什么这让我很烦恼

  • Application.RootVisual只能设置一次。 所以你不能有两个PhoneApplicationFrames,每个都有自己的BackStack,在两者之间交换RootVisual

  • 你无法遍历BackStack(毕竟它是一个Stack)。 只能调用GoBack() 。 调用GoForward()将抛出exception。

  • PhoneApplicationFrame.GoBack()从BackStack中删除条目,只能通过PhoneApplicationFrame.Navigate(...)方法再次添加。 因此,操纵BackStack是不行的。

聪明的想法

  • 保持Dictionary<enum, List> ,每次调用自定义NavigationService.Navigate(tabTypeEnum, uriString, params) 。 这将保留每个tabType的导航历史记录,从而允许我们在处理BackKeyPress事件时导航当前Tab的历史记录。 不好的是 ,调用Navigate(...)转到上一页(而不是GoBack )将添加到BackStack。 所以需要维护,这会伤害我的大脑。

  • 创建自定义NavigationAwareTabPage : PhoneApplicationPage ,通过在Content更改时设置转换动画来跟踪其自己的导航历史记录和伪造导航。 我们唯一一次调用真正的 Navigate是我们从一个标签切换到另一个标签。 (我认为这是IE应用程序的function。) BackKeyPress必须如下所示。

这个:

 void RootFrame_BackKeyPress(object sender, CancelEventArgs e) { var rootFrame = sender as PhoneApplicationFrame; if (rootFrame.CanGoBack) { // Get the NavigationAwarePage var navAwarePage = rootFrame.Content as NavigationAwareTabPage; if(navAwarePage.CanGoBack()) { // This method "navigates" to the next page // by changing the navAwarePage.Content navAwarePage.GoBackToPreviousPage(); e.Cancel = true; } } } 

有没有人走过这条路?

ReactiveUI如何覆盖Back按钮的所有魔力在这里:

https://github.com/reactiveui/ReactiveUI/blob/master/ReactiveUI.Mobile/WP8AutoSuspendApplication.cs#L91

这在ReactiveUI中的工作方式是,有一个名为RoutedViewHost的内容控件正在监听返回信号(您可以根据硬件返回按钮执行任何操作,并取消默认操作)。 ReactiveUI维护自己的基于ViewModel的后端堆栈并操纵而不是使用WP8,并且您从不调用WP8s导航方法。

这实际上意味着,从WP8的角度来看,整个应用程序中只有一个页面。 WP8 确实想要自己创建该页面,它在WMAppManifest.xml指定。

不要试图参与WP8的Frame系统,它真的想以自己的方式工作,否则你将无法说服它。

最后一件重要的事情,如果你在后面的堆栈底部,你必须允许默认的Back操作发生(即WP8想要做什么,带你离开应用程序)。 否则你可能会失败认证而你正在做错了。