Prism for Xamarin Forms - 从标签页导航

Posted

技术标签:

【中文标题】Prism for Xamarin Forms - 从标签页导航【英文标题】:Prism for Xamarin Forms - Navigating from a tabbedpage 【发布时间】:2016-11-21 09:40:50 【问题描述】:

(使用 Prism 6.1.0-pre6 和 XF 2.3.0.107)

总结:从 TabbedPage 导航到 ContentPage 不会显示工具栏/操作栏。

我从另一个页面导航到 TabbedPage (MainPage.xaml)。这看起来像这样:

<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Or.Console.Views"
             xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
             prism:ViewModelLocator.AutowireViewModel="True"
             x:Class="Or.Console.Views.MainPage">
  <local:APage/>
  <local:BPage/>
  <local:CPage/>
</TabbedPage>

在 APage 的 ViewModel 中,我正在调用

_navigationService.NavigateAsync("DetailsPage");

DetailsPage 只是一个 ContentPage,我希望它会在顶部显示后退按钮和操作栏,但事实并非如此。

我猜这是因为 Prism 不知道标签子页面,只知道 TabbedPage 本身。

我尝试使用 Prism 注册标签子页面,但这似乎不起作用。还尝试将每个子选项卡包装在 NavigationPage 中,但这会导致工具栏重复出现一些奇怪的行为。

在选项卡式内容中导航的正确方法是什么?

编辑: 为了回应 Brian Lagunas 的回答,我尝试将 TabbedPage 包装在 NavigationPage 中,所以当我导航到它时,我正在调用

 _navigationService.NavigateAsync("DeviceNavWrapper/MainPage");

但这给出了一个奇怪的结果:

EDIT2:在我的案例中,解决方案最终是我需要从 APage 调用 NavigateAsync 并将 useModalNavigation 设置为 false。所以现在 APage 有这个:

_navigationService.NavigateAsync("DetailsPage", null, false);

【问题讨论】:

谢谢 Erin,这解决了我的问题 【参考方案1】:

在顶部获得后退按钮的唯一方法是将页面嵌套在 NavigationPage 中。这是标准的 Xamarin.Forms 行为。所以你有几个选择。一种是将您的 APage 包装在 NavigationPage 中。然后,当您从 APageViewModel 调用 NavigateAsync("DetailsPage") 时,它将按您的意愿工作。

编辑:如果您想导航到完全不同的页面并替换 TabbedPage,请确保将 TabbedPaged 包装在 NavigationPage 中,并从 TabbedPageViewModel 导航。

【讨论】:

感谢 Brian 的回复(以及您在 Prism XF 上所做的出色工作)。是的,这正是我想要的 - 替换 TabbedPage。我遇到的问题是将 TabbedPage (MainPage) 包装在 NavigationPage 中,使其显示为双工具栏。我得到了汉堡包和它下面的后退按钮,以及重复的操作按钮集。我是不是哪里出错了? 我猜我的 TabbedPage 必须已经包装在堆栈中较早的导航页面中,因此是重复的。我最终破解了从 APage 中的控件对 TabbedPage 的导航调用,并且它起作用了!现在我必须弄清楚如何将命令从 APage 上的控件绑定到父标签页。这似乎可行,但不太理想。想知道我们是否会看到 Prism 或 XF 的增强功能以​​使其更清洁? 我绝对可以看出这在哪里有用。现在只考虑模态导航。例如,如果您从 APage 模态导航它会起作用(替换 tabbedPage),但并没有真正考虑在 NaviagionPage 内导航。这可能有点棘手,但让我考虑一下。 啊!这正是我所需要的。如果我只是将 useModalNavigation 标志设置为 false 进行导航,我将获得返回按钮和我需要的行为。直到你提到它,我才开始寻找它。非常感谢。 太棒了!我很高兴就这么简单。【参考方案2】:

为了消除重复的工具栏,我发现设置

   NavigationPage.HasNavigationBar="False"

NavigationPage Wrapper 更简单

【讨论】:

以上是关于Prism for Xamarin Forms - 从标签页导航的主要内容,如果未能解决你的问题,请参考以下文章

LINKs: Xamarin.Forms + Prism

Xamarin Forms Prism:prism ResourceDictionary 中已存在具有键“Xamarin.Forms.NavigationPage”的资源

Xamarin.Forms FlyoutPage 不适用于 Prism

使用 Xamarin.Forms 和 Prism 的图像点击事件

Prism Xamarin Forms ToolbarItem 出现两次

为啥在使用 Prism 在 Xamarin.Forms 中导航到 root 时,我的 NavigationPage 顶部会出现默认标题?