c# - 在 Windows Phone 8 中实现类似 Tab 的导航模型——怎么做?

标签 c# silverlight windows-phone-8

我目前正在尝试实现一种与 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 导航。被改变了。我们唯一一次调用 true Navigate是当我们从一个选项卡切换到另一个选项卡时。 (我认为这就是 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 如何覆盖后退按钮的所有魔力都在这里:

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

这在 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/

相关文章:

c# - 调用套接字的ReceiveAsync()调用后,接收到的数据缓冲区始终为空吗?

c# - 实例变量

silverlight - 如何在浏览器中显示 3D 对象?

c# - 异步请求如何用于服务器端验证

c# - 单击 Windows Phone 中的网格

silverlight - 以编程方式将图像添加到 RichTextBox 不会显示在 Xaml 属性中

c# - 在 ScrollViewer 中移动对象

image - 从项目文件加载图像

c# - 使用 token 通过 OAuth2 在 Twitter 上进行搜索

c# - 如何从字符串中删除非数字但在 C# 中保留小数