PRISM Xamarin.Forms INAVigationService理解

时间:2017-04-13 09:18:43

标签: android xamarin xamarin.forms prism prism-6

我正在努力了解PRISM INavigationService如何映射到Xamarin Forms提供的标准Navigation.PushAsync

我有一个应用程序,我已经开始使用XF。它由一个MasterDetailPage组成,它是主页,“详细信息”ContentPage包含许多按钮,用于导航到其他功能。在App.xaml.cs中,我将Application.MainPage设置为包含在NavigationPage“MainPage = new NavigationPage(new HomePage())”中的主页实例。当我想要显示功能页面时,我调用“Navigation.PushAsync(new NewPage())”,这会显示新页面以及包含后退按钮的工具栏;然后,我可以使用设备上的后退按钮或使用工具栏中的后退按钮导航回我的主页。请注意,该应用程序正在Android上运行。

然后我看了整合PRISM.Forms;我想使用它,因为我已经使用PRISM for WPF多年,并认为它应该证明是有益的。我使用的是最新版本(6.3)。

我创建了一个基于“PRISM模板”的新应用程序,然后将差异复制到我现有的项目中......

  • “App”类现在基于“PrismApplication”而不是 “应用程序”在“PrismApplication.RegisterTypes”
  • 我为所有想要的表单调用“Container.RegisterForNavigation” 能够导航到“PrismApplication.OnInitialized”
  • 的末尾
  • 我称之为“INAVigationService.NavigateAsync($”/ {nameof(NavigationPage)} / {nameof(HomeMasterDetailPage)}“);”
  • 我以前称之为“Navigation.PushAsync”,我打电话 “INAVigationService.NavigateAsync(nameof(NewPage))”内 “MainActivity”我用“App”构造函数调用 “IPlatformInitializer”

到目前为止,这么好。我按预期看到了我的主页。然而,当我导航到“NewPage”时,工具栏中没有后退按钮(虽然我仍然有来自MasterDetailPage的“汉堡包”菜单)如果我使用设备上的后退按钮它会返回给我操作系统。似乎该页面已作为MasterDetailPage的“Content”部分插入,而不是作为新的子页面导航到该页面。

我确信这不是设计因素,因此我误解了一些事情,但有人可能会指出我正确的方向,否则我觉得我将不得不放弃PRISM并寻找替代方案。

在尝试将登录屏幕引入混音时,我也遇到了问题。我首先调用“INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(LoginPage)}");”然后如果登录成功,我调用“INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}");”进入主页;问题在于,当显示主页(MasterDetailPage)时,我不再看到“汉堡包”按钮来打开页面的“主”部分。我怀疑这可能与我错误地使用INavigationService有关,但如果不是,我可以将其作为一个单独的问题提出。

1 个答案:

答案 0 :(得分:1)

Prism's INavigationService essentially maps to the Xamarin Forms INavigation in this way: INavigationService.NavigateAsync => INavigation.PushAsync (or PushModalAsync if you set the useModal flag to true), & INavigationService.GoBackAsync => INavigation.PopAsync.

The INavigationService uses the container to resolve any pages that you specify in the Uri that you pass it and then pushes them onto the Navigation Stack. You may want to check out the various samples available, including the "HamburgerMenu" project which shows the use of a MasterDetailPage and it uses a LoginPage.