diff --git a/src/Maui/Prism.Maui/Navigation/PageNavigationService.cs b/src/Maui/Prism.Maui/Navigation/PageNavigationService.cs index da138875f..e4b3e5852 100644 --- a/src/Maui/Prism.Maui/Navigation/PageNavigationService.cs +++ b/src/Maui/Prism.Maui/Navigation/PageNavigationService.cs @@ -353,13 +353,27 @@ public virtual async Task NavigateFromAsync(string viewName, var navigationPages = currentPage.Navigation.NavigationStack.ToList(); navigationPages.Reverse(); var foundPage = navigationPages.FirstOrDefault(page => ViewModelLocator.GetNavigationName(page) == viewName); - var removePageCount = navigationPages.IndexOf(foundPage); - - // Insert RemovePageSegment. - var routeString = route.ToString(); - for (int i = 0; i < removePageCount; i++) + if (foundPage is null) { - AddToFront(navigationSegments, RemovePageSegment); + var page = currentPage; + while (page != null) + { + if (page is not null && ViewModelLocator.GetNavigationName(page) == viewName) + break; + page = page.GetParentPage(); + } + currentPage = page; + } + else + { + var removePageCount = navigationPages.IndexOf(foundPage); + + // Insert RemovePageSegment. + var routeString = route.ToString(); + for (int i = 0; i < removePageCount; i++) + { + AddToFront(navigationSegments, RemovePageSegment); + } } await ProcessNavigation(currentPage, navigationSegments, parameters, null, null); diff --git a/tests/Maui/Prism.DryIoc.Maui.Tests/Fixtures/Navigation/NavigationTests.cs b/tests/Maui/Prism.DryIoc.Maui.Tests/Fixtures/Navigation/NavigationTests.cs index ba5ed8903..2d2a65156 100644 --- a/tests/Maui/Prism.DryIoc.Maui.Tests/Fixtures/Navigation/NavigationTests.cs +++ b/tests/Maui/Prism.DryIoc.Maui.Tests/Fixtures/Navigation/NavigationTests.cs @@ -510,7 +510,7 @@ public async Task Navigation_Animation_IsFalse() } [Fact] - public async Task Navigation_FromPageUsingRoute_OnNavigationPage() + public async Task Navigation_FromPageUsingRoute() { var mauiApp = CreateBuilder(prism => prism.CreateWindow("NavigationPage/MockViewA/MockViewB/MockViewC")) .Build(); @@ -526,6 +526,23 @@ public async Task Navigation_FromPageUsingRoute_OnNavigationPage() Assert.Equal("MockViewA/MockViewD/MockViewE", currentNavigationStackUri); } + [Fact] + public async Task Navigation_FromRootNavigationPageUsingRoute() + { + var mauiApp = CreateBuilder(prism => prism.CreateWindow("NavigationPage/MockViewA/MockViewB/MockViewC")) + .Build(); + var window = GetWindow(mauiApp); + var navigationService = Prism.Navigation.Xaml.Navigation.GetNavigationService(window.CurrentPage); + var currentNavigationStackUri = string.Join("/", window.CurrentPage.Navigation.NavigationStack.Select(v => v.GetType().Name)); + Assert.Equal("MockViewA/MockViewB/MockViewC", currentNavigationStackUri); + + var result = await navigationService.NavigateFromAsync("NavigationPage", UriParsingHelper.Parse("MockViewD/MockViewE"), null); + + Assert.True(result.Success); + currentNavigationStackUri = string.Join("/", window.CurrentPage.Navigation.NavigationStack.Select(v => v.GetType().Name)); + Assert.Equal("MockViewD/MockViewE", currentNavigationStackUri); + } + [Fact] public async Task Navigation_FromIntermediatePageUsingRoute() {