Skip to content

Commit

Permalink
Modify NavigateFromAsync to find parent pages
Browse files Browse the repository at this point in the history
  • Loading branch information
niimima committed Jul 29, 2024
1 parent 41b3270 commit e1a4cf5
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 7 deletions.
26 changes: 20 additions & 6 deletions src/Maui/Prism.Maui/Navigation/PageNavigationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -353,13 +353,27 @@ public virtual async Task<INavigationResult> 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;

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)

Check failure on line 362 in src/Maui/Prism.Maui/Navigation/PageNavigationService.cs

View workflow job for this annotation

GitHub Actions / build-prism-maui / Build Prism.Maui

'Page' does not contain a definition for 'GetParentPage' and no accessible extension method 'GetParentPage' accepting a first argument of type 'Page' could be found (are you missing a using directive or an assembly reference?)
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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()
{
Expand Down

0 comments on commit e1a4cf5

Please sign in to comment.