2017-04-13 78 views
0

我在努力瞭解PRISM INavigationService如何映射到由Xamarin Forms提供的標準Navigation.PushAsyncPRISM Xamarin.Forms INavigationService瞭解

我有一個應用程序,我已經開始使用XF。它由主頁上的MasterDetailPage組成,「細節」ContentPage包含多個用於隨後導航到其他功能的按鈕。在App.xaml.cs中,我將Application.MainPage設置爲封裝在導航頁「MainPage = new NavigationPage(new HomePage())」中的主頁實例。當我想顯示一個功能頁面時,我稱之爲「Navigation.PushAsync(new NewPage())」,這顯示了新頁面和一個包含後退按鈕的工具欄;然後,我可以使用設備上的後退按鈕或使用工具欄中的後退按鈕導航回我的主頁。請注意,該應用程序正在Android上運行。

然後我看着整合PRISM.Forms;我想用這個,因爲我已經使用了PRISM for WPF多年,並且覺得它應該是有益的。我正在使用最新版本(6.3)。

我創建基於「PRISM模板」的新應用程序,然後複製,而不是差異爲我現有的項目...

  • 「應用程序」類現在是基於關閉的「PrismApplication」 「應用程序」在「PrismApplication.RegisterTypes」
  • 我稱之爲「Container.RegisterForNavigation」所有的,我想 能夠瀏覽到在的「PrismApplication.OnInitialized」
  • 我打電話年底形式「 INavigationService.NavigateAsync($「/ {nameof(NavigationPage )}/{nameof(HomeMasterDetailPage)} 「);」
  • 哪裏以前被稱爲 「Navigation.PushAsync」,我稱之爲 「INavigationService.NavigateAsync(nameof(NewPage公司))」 在 「MainActivity」 我所說的 「應用程序」 的構造與 「IPlatformInitializer」

到目前爲止,這麼好。如預期的那樣,我看到了我的主頁。然而,當我然後導航到「NewPage」時,我沒有工具欄中的後退按鈕(雖然我仍然有我的「漢堡」菜單MasterDetailPage),如果我使用設備上的後退按鈕,它會使我返回到操作系統。看起來,該頁面已被插入爲MasterDetailPage的「內容」部分,而不是作爲新的子頁面導航到它。

我確定這不是設計,因此我誤解了一些東西,但有人能指引我回到正確的方向,否則我覺得我將不得不放棄PRISM並尋找替代方案。

我在試圖將登錄屏幕引入混音時也遇到了問題。我從調用「INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(LoginPage)}");」開始,然後如果登錄成功,我會撥打「INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}");」以進入主頁;問題在於,當顯示主頁(MasterDetailPage)時,我不再看到「漢堡包」按鈕來打開頁面的「主」部分。我懷疑這也可能與我錯誤地使用INavigationService有關,但如果不是,我可以將它作爲單獨的問題提出。

回答

1

棱鏡的INavigationService基本映射到Xamarin窗體這樣INavigationINavigationService.NavigateAsync =>INavigation.PushAsync(或PushModalAsync如果設置useModal標誌設置爲true),& INavigationService.GoBackAsync =>INavigation.PopAsync

INavigationService使用容器來解析您在Uri中指定的任何頁面,然後將它們傳遞到導航堆棧。您可能想要查看各種可用的samples,包括顯示使用MasterDetailPage的「HamburgerMenu」項目,並使用LoginPage。

+0

謝謝,這是我如何預期它的工作,但唉,我不能讓它行爲我想要的方式。我認爲問題在於,因爲我正在使用MasterDetailPage,因此INavigationService正在設置「詳細信息」頁面,而不是調用PushAsync(我似乎回憶關於此處的內容,但現在找不到它)。如果我可以重寫此功能,我認爲它會解決我的問題。 –

+0

查看了您引用的示例後,我找不到與我的場景匹配的任何內容。我試圖實現的是MasterDetailPage.Content被用作主菜單,從菜單中點擊一個項目使用PushAsync導航到一個新頁面(而不是替換當前的「詳細」頁面),而「主」是另一個菜單選項僅在顯示主菜單時可用。從菜單打開的所有頁面都應顯示後退按鈕,而不是MasterDetailPage中的漢堡菜單。 –

+0

好的。發現正在發生的事情;因爲我從MasterDetailPage導航,INavigationService.NavigateAsync正在調用PageNavigationService.ProcessNavigationForMasterDetailPage(https://github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs#L298)它可以調用PushModalAsync(通過DoPush),也可以替換當前的「Details」頁面 - 具體取決於「useModalNavigation」參數值。我在代碼中看不到任何內容,只會使用參數來改變行爲。 –