2017-04-13 13 views
0

PRISM INavigationService이 Xamarin Forms에서 제공하는 Navigation.PushAsync 표준에 매핑되는 방식을 이해하는 데 어려움을 겪고 있습니다.PRISM Xamarin.Forms INavigationService 이해

XF를 사용하기 시작한 응용 프로그램이 있습니다. 홈 페이지 인 MasterDetailPage과 다른 기능으로 이동하는 데 사용되는 여러 개의 버튼이 포함 된 "Detail"ContentPage으로 구성됩니다. App.xaml.cs 내에서 Application.MainPage를 NavigationPage "MainPage = new NavigationPage(new HomePage())"내에 래핑 된 내 홈 페이지의 인스턴스로 설정합니다. 기능 페이지를 표시하려면 "Navigation.PushAsync(new NewPage())"을 호출하면 새 페이지가 뒤로 단추가있는 도구 모음과 함께 표시됩니다. 그런 다음 장치의 뒤로 단추 나 도구 모음의 뒤로 단추를 사용하여 내 홈 페이지로 돌아갈 수 있습니다. 응용 프로그램이 Android에서 실행 중입니다.

그런 다음 PRISM.Forms를 통합하여 보았습니다. 저는 수년 동안 WPF 용 PRISM을 사용해 왔기 때문에 이것을 사용하고 싶었습니다. 최신 버전 (6.3)을 사용하고 있습니다.

는 내가 "PRISM 템플릿"을 기반으로 새로운 응용 프로그램을 만든 다음 '앱'클래스는 이제 "PrismApplication"의 해제를 기반으로

  • 기존 프로젝트에 차이 ... 대신 복제 "PrismApplication.RegisterTypes"내가
  • 내가 전화 "PrismApplication.OnInitialized"의 말을 탐색 할 수 에 원하는 형태의 모든 "Container.RegisterForNavigation"전화
  • "내"응용 프로그램 " INavigationService.NavigateAsync ($ "/ {nameof (NavigationPage)}/{nameof (HomeMasterDetailPage)} ");" 내가 이전에 "Navigation.PushAsync"라고
  • , 내가 는 "INavigationService.NavigateAsync (nameof (NEWPAGE가))" "MainActivity"내 내가
"IPlatformInitializer"와 "응용 프로그램"생성자를 호출 전화

지금까지 그렇게 좋았습니다. 내 홈페이지가 예상대로 표시됩니다. 그러나 "NewPage"로 이동하면 도구 모음에 뒤로 버튼이 없습니다 (아직 "hamburger"메뉴가 MasterDetailPage에서 있지만). 다시 버튼을 사용하면 운영 체제로 돌아갑니다. 페이지가 새로운 하위 페이지로 탐색하는 대신 MasterDetailPage의 "Content"섹션으로 삽입 된 것으로 보입니다.

이것은 의도적으로 설계된 것이 아니므로 오해의 소지가 있다고 생각합니다. 그렇지 않으면 누군가가 올바른 방향으로 나를 가리킬 수 있습니다. 그렇지 않으면 필자는 프리즘을 버리고 대안을보아야 할 것이라고 생각합니다.

믹스에 로그인 화면을 도입 할 때도 문제가 있습니다. 먼저 "INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(LoginPage)}");"으로 전화를 시작한 다음 로그인이 성공하면 "INavigationService.NavigateAsync($"/{nameof(NavigationPage)}/{nameof(HomeMasterDetailPage)}");"을 호출하여 홈페이지로 이동합니다. 여기서 문제는 홈 페이지 (MasterDetailPage)를 표시 할 때 페이지의 "마스터"부분을 여는 "햄버거"버튼이 더 이상 보이지 않는다는 것입니다. 나는 이것이 아마도 또한 INavigationService을 사용하는 것과 관련이 있다고 생각하지만 그렇지 않은 경우에는 별개의 문제로 제기 할 수 있습니다.

답변

1

프리즘의 INavigationService 자 마린이 방법으로 INavigation 양식에 기본적으로 매핑 : INavigationService.NavigateAsync =>INavigation.PushAsync (또는 PushModalAsync true로 useModal 플래그를 설정 한 경우), & INavigationService.GoBackAsync =>INavigation.PopAsync합니다.

INavigationService은 컨테이너를 사용하여 Uri에서 지정하고 페이지를 전달한 다음이를 탐색 스택에 푸시하는 페이지를 확인합니다. 을 사용할 수 있으며, "HamburgerMenu"프로젝트에는 MasterDetailPage의 사용을 보여 주며 LoginPage를 사용합니다.

+0

고마워, 그게 내가 기대했던 방식이지만, 슬프게도 내가 원하는 방식으로 행동하게 만들 수는 없어. 문제는 내가 MasterDetailPage를 사용할 때 INavigationService가 PushAsync를 호출하는 대신 "Detail"페이지를 설정한다는 것입니다 (나는 이것을 어딘가에 읽었지만 지금은 찾을 수 없다). 이 기능을 재정의 할 수 있다면 내 문제가 해결 될 것이라고 생각합니다. –

+0

참조한 샘플을 검토 한 결과 내 시나리오와 일치하는 것을 찾을 수 없습니다. 내가 달성하고자하는 것은 MasterDetailPage.Content가 주 메뉴로 사용되는데, 여기에서 항목을 두드리는 것은 PushAsync (현재 "Detail"페이지를 대체하는 대신)를 사용하여 새 페이지로 이동하는 반면 "Master"는 추가 메뉴입니다. 옵션은 기본 메뉴가 표시된 경우에만 사용할 수 있습니다. 메뉴에서 열린 모든 페이지에는 MasterDetailPage의 햄버거 메뉴가 아닌 뒤로 버튼이 표시됩니다. –

+0

확인. 무슨 일이 일어나고 있는지 발견했다. 내가 MasterDetailPage에서 탐색 중이기 때문에 INavigationService.NavigateAsync가 PageNavigationService.ProcessNavigationForMasterDetailPage (https://github.com/PrismLibrary/Prism/blob/master/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs#L298)를 호출하고 있습니다. useModalNavigation "매개 변수 값에 따라 PushModalAsync (DoPush를 통해)를 호출하거나 현재"세부 정보 "페이지를 대체합니다. 코드 내에서 매개 변수를 사용하여 동작을 변경할 수있는 것은 아무것도 없습니다. –