我目前正在尝试实现一种与 Windows Phone 8 上的 Internet Explorer 应用程序非常相似的导航方案。
IE 应用程序可以有多个选项卡,用户可以在这些选项卡之间切换。这些选项卡中的每一个都有自己的历史记录。点击手机上的后退按钮会将您带到该选项卡导航历史记录中的上一页(不是 PhoneApplicationFrame.BackStack
)。如果没有之前的页面,后退按钮会将您带到之前打开的选项卡,如果没有,则退出应用。
为什么这让我烦恼
Application.RootVisual
只能设置一次。所以你不能有两个 PhoneApplicationFrames,每个都有自己的 BackStack,来交换RootVisual
两者之间。您不能遍历 BackStack(毕竟它是一个 Stack)。只能调用
GoBack()
.打电话GoForward()
将抛出异常。PhoneApplicationFrame.GoBack()
从 BackStack 中删除只能通过PhoneApplicationFrame.Navigate(...)
再次添加的条目方法。因此,操纵 BackStack 是不行的。
好主意
保留
Dictionary<enum, List<string>>
每次调用自定义NavigationService.Navigate(tabTypeEnum, uriString, params)
时都会更新.这将保留每个tabType
的导航历史记录,使我们能够在BackKeyPress
时浏览当前选项卡的历史记录。事件被处理。 坏事是,调用Navigate(...)
转到以前的页面(而不是GoBack
)将添加到 BackStack。所以现在需要维护,这会伤害我的大脑。创建自定义
NavigationAwareTabPage : PhoneApplicationPage
,它通过在其Content
时动画转换来跟踪自己的导航历史和 fakes 导航。被改变了。我们唯一一次调用 trueNavigate
是当我们从一个选项卡切换到另一个选项卡时。 (我认为这就是 IE 应用程序所做的。)和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 如何覆盖后退按钮的所有魔力都在这里:
这在 ReactiveUI 中的工作方式是有一个名为 RoutedViewHost
的内容控件正在监听返回信号(你可以做任何你想响应硬件后退按钮并取消默认操作)。 ReactiveUI 维护其自己的基于 ViewModel 的返回堆栈并操作那个而不是使用 WP8,而且您永远不会调用 WP8 的导航方法。
这实际上意味着,从 WP8 的角度来看,整个应用程序中只有一个页面。 WP8 真的想要自己创建该页面,它在 WMAppManifest.xml
中指定。
不要试图参与WP8的Frame系统,它真的想按自己的方式工作,否则你无法说服它。
最后一件重要的事情,如果你在你的返回堆栈的底部,你必须允许默认的返回 Action 发生(即 WP8 想要做的, 把你带出应用)。否则,您可能无法通过认证,并且您做错了™。
关于c# - 在 Windows Phone 8 中实现类似 Tab 的导航模型——怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103266/