diff options
author | nuits.jp <nuits.jp@live.jp> | 2017-05-12 16:37:04 +0300 |
---|---|---|
committer | nuits.jp <nuits.jp@live.jp> | 2017-05-12 16:37:04 +0300 |
commit | 892c6cc6f72c89067004aaf2b5f68fb0d8dc3b86 (patch) | |
tree | 498b207e9f444c52914df04a96360bf7033c2fef | |
parent | 00a3aa5a920b0220f90a92c253d1cfd71fe2798c (diff) |
Updating MasterDetailPage Navigation
If Detail is null, change to set the next Page to Detail in all cases.
4 files changed, 56 insertions, 13 deletions
diff --git a/Source/PrismLibrary_XF.sln b/Source/PrismLibrary_XF.sln index 33b3ccb..09daf72 100644 --- a/Source/PrismLibrary_XF.sln +++ b/Source/PrismLibrary_XF.sln @@ -1,7 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 +# Visual Studio 15 +VisualStudioVersion = 15.0.26403.7 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Prism", "Prism\Prism.csproj", "{E6C50355-D01E-4CAA-884D-D7929861315C}" EndProject @@ -114,6 +114,7 @@ Global {B6E74918-D92B-4690-BEC9-0BB199A6E933}.Test|x64.ActiveCfg = Test|Any CPU {B6E74918-D92B-4690-BEC9-0BB199A6E933}.Test|x86.ActiveCfg = Test|Any CPU {DD171BA8-7B2D-4722-B5BF-E0A9EBFA1D5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD171BA8-7B2D-4722-B5BF-E0A9EBFA1D5F}.Debug|Any CPU.Build.0 = Debug|Any CPU {DD171BA8-7B2D-4722-B5BF-E0A9EBFA1D5F}.Debug|ARM.ActiveCfg = Debug|Any CPU {DD171BA8-7B2D-4722-B5BF-E0A9EBFA1D5F}.Debug|x64.ActiveCfg = Debug|Any CPU {DD171BA8-7B2D-4722-B5BF-E0A9EBFA1D5F}.Debug|x86.ActiveCfg = Debug|Any CPU diff --git a/Source/Xamarin/Prism.Forms.Tests/Mocks/Views/MasterDetailPageMock.cs b/Source/Xamarin/Prism.Forms.Tests/Mocks/Views/MasterDetailPageMock.cs index 1bcc79a..60f902e 100644 --- a/Source/Xamarin/Prism.Forms.Tests/Mocks/Views/MasterDetailPageMock.cs +++ b/Source/Xamarin/Prism.Forms.Tests/Mocks/Views/MasterDetailPageMock.cs @@ -35,6 +35,7 @@ namespace Prism.Forms.Tests.Mocks.Views public MasterDetailPageEmptyMock() { ViewModelLocator.SetAutowireViewModel(this, true); + Master = new ContentPageMock {Title = "Master"}; } } } diff --git a/Source/Xamarin/Prism.Forms.Tests/Navigation/PageNavigationServiceFixture.cs b/Source/Xamarin/Prism.Forms.Tests/Navigation/PageNavigationServiceFixture.cs index fd2e11b..f3998a2 100644 --- a/Source/Xamarin/Prism.Forms.Tests/Navigation/PageNavigationServiceFixture.cs +++ b/Source/Xamarin/Prism.Forms.Tests/Navigation/PageNavigationServiceFixture.cs @@ -659,6 +659,26 @@ namespace Prism.Forms.Tests.Navigation await navigationService.NavigateAsync("MasterDetailPage-Empty/ContentPage"); + Assert.Equal(1, rootPage.Navigation.ModalStack.Count); + Assert.Equal(0, rootPage.Navigation.NavigationStack.Count); + + var masterDetail = rootPage.Navigation.ModalStack[0] as MasterDetailPageEmptyMock; + Assert.NotNull(masterDetail); + Assert.NotNull(masterDetail.Detail); + Assert.IsType(typeof(ContentPageMock), masterDetail.Detail); + } + + [Fact] + public async void DeepNavigate_ToEmptyMasterDetailPage_ToContentPage_UseModalNavigation() + { + var navigationService = new PageNavigationServiceMock(_container, _applicationProvider, _loggerFacade); + var rootPage = new Xamarin.Forms.ContentPage(); + ((IPageAware)navigationService).Page = rootPage; + + await navigationService.NavigateAsync("MasterDetailPage-Empty/ContentPage", useModalNavigation: true); + + Assert.Equal(1, rootPage.Navigation.ModalStack.Count); + Assert.Equal(0, rootPage.Navigation.NavigationStack.Count); var masterDetail = rootPage.Navigation.ModalStack[0] as MasterDetailPageEmptyMock; Assert.NotNull(masterDetail); Assert.NotNull(masterDetail.Detail); @@ -666,6 +686,27 @@ namespace Prism.Forms.Tests.Navigation } [Fact] + public async void DeepNavigate_ToEmptyMasterDetailPage_ToContentPage_NotUseModalNavigation() + { + var navigationService = new PageNavigationServiceMock(_container, _applicationProvider, _loggerFacade); + var rootPage = new ContentPageMock(); + var navigationPage = new NavigationPage(rootPage); + ((IPageAware)navigationService).Page = rootPage; + + Assert.Equal(1, rootPage.Navigation.NavigationStack.Count); + Assert.IsType<ContentPageMock>(navigationPage.CurrentPage); + + await navigationService.NavigateAsync("MasterDetailPage-Empty/ContentPage", useModalNavigation: false); + + Assert.Equal(0, rootPage.Navigation.ModalStack.Count); + Assert.Equal(2, rootPage.Navigation.NavigationStack.Count); + var masterDetail = rootPage.Navigation.NavigationStack[1] as MasterDetailPageEmptyMock; + Assert.NotNull(masterDetail); + Assert.NotNull(masterDetail.Detail); + Assert.IsType(typeof(ContentPageMock), masterDetail.Detail); + } + + [Fact] public async void DeepNavigate_ToEmptyMasterDetailPage_ToNavigationPage() { var navigationService = new PageNavigationServiceMock(_container, _applicationProvider, _loggerFacade); diff --git a/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs b/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs index bb30e80..2f79d6c 100644 --- a/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs +++ b/Source/Xamarin/Prism.Forms/Navigation/PageNavigationService.cs @@ -299,27 +299,27 @@ namespace Prism.Navigation { bool isPresented = GetMasterDetailPageIsPresented(currentPage); - if (useModalNavigation.HasValue && useModalNavigation.Value) + var detail = currentPage.Detail; + if (detail == null) { - var nextPage = CreatePageFromSegment(nextSegment); - await ProcessNavigation(nextPage, segments, parameters, useModalNavigation, animated); - await DoNavigateAction(currentPage, nextSegment, nextPage, parameters, async () => + var newDetail = CreatePageFromSegment(nextSegment); + await ProcessNavigation(newDetail, segments, parameters, newDetail is NavigationPage ? false : true, animated); + await DoNavigateAction(null, nextSegment, newDetail, parameters, onNavigationActionCompleted: () => { currentPage.IsPresented = isPresented; - await DoPush(currentPage, nextPage, true, animated); + currentPage.Detail = newDetail; }); return; } - var detail = currentPage.Detail; - if (detail == null) + if (useModalNavigation.HasValue && useModalNavigation.Value) { - var newDetail = CreatePageFromSegment(nextSegment); - await ProcessNavigation(newDetail, segments, parameters, newDetail is NavigationPage ? false : true, animated); - await DoNavigateAction(null, nextSegment, newDetail, parameters, onNavigationActionCompleted: () => + var nextPage = CreatePageFromSegment(nextSegment); + await ProcessNavigation(nextPage, segments, parameters, useModalNavigation, animated); + await DoNavigateAction(currentPage, nextSegment, nextPage, parameters, async () => { currentPage.IsPresented = isPresented; - currentPage.Detail = newDetail; + await DoPush(currentPage, nextPage, true, animated); }); return; } |