PrismLibrary/Prism · error · NavigationException
NavigationException.CannotPopApplicationMainPage
NavigationException.CannotPopApplicationMainPage
Error message
NavigationException.CannotPopApplicationMainPage
What it means
Prism's PageNavigationService throws this when a GoBackAsync would pop the application's main (root) page. On MAUI the root PrismWindow page cannot be removed; on Android Prism instead moves the task to the background (MoveTaskToBack), but on other platforms it refuses with CannotPopApplicationMainPage because removing the root page would leave the window empty.
Solutions
- Guard the back call: only call GoBackAsync when CanNavigate (more than one page in the stack).
- On Android, rely on Prism's MoveTaskToBack behavior and handle the root page's back explicitly (e.g. SystemNavigationManager or activity behavior).
- Replace the root instead of popping: use NavigateAsync with the absolute URI ('app://...') or NavigateAsync("/NewRoot") semantics appropriate for your flow.
- Hide/disable back buttons on the root page so users cannot trigger the pop.
Example fix
// before
private async void OnBack() => await _navigationService.GoBackAsync();
// after
private async void OnBack()
{
if (App.Current.Windows[0].Page.Navigation.NavigationStack.Count > 1)
await _navigationService.GoBackAsync();
} Defensive patterns
Strategy: validation
Validate before calling
var navStack = App.Current.Windows[0].Page.Navigation.NavigationStack;
bool isRoot = navStack.Count <= 1;
if (!isRoot)
await _navigationService.GoBackAsync(); Prevention
- Hide back buttons when the page is the window's root page.
- Check NavigationStack.Count before popping.
- Replace root pages via absolute navigation rather than popping.
When it happens
Trigger: Calling navigationService.GoBackAsync() (or a URI with '../' segments that consumes the root) when the current page is the application's root/main page of the window; GoBackToRootAsync edge cases where the main page is on the stack.
Common situations: Hardware/software back button handling on the login/home page; a 'back' command wired to the root page after a fresh app start; navigation stack shrunk to one page (root) but UI still shows a back affordance.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Cannot destroy .
- The page type ' ' is not supported.
- Unable to determine the current page.
- Value cannot be null. (Parameter 'view')
- The view type ' ' is not a type of Page.
AI-assisted analysis of PrismLibrary/Prism@358118cd64 (2026-09-15).
Data as JSON: /api/errors/2044f4a68b28280a.
Report an issue: GitHub.
Appendix: source
Thrown at src/Maui/Prism.Maui/Navigation/PageNavigationService.cs:1349
return false;
}
internal static bool UseReverseNavigation(Page currentPage, Type nextPageType)
{
return MvvmHelpers.HasNavigationPageParent(currentPage) && MvvmHelpers.IsSameOrSubclassOf<ContentPage>(nextPageType);
}
private INavigationResult SendAppToBackground(Page page)
{
#if ANDROID
if (Window.Handler.PlatformView is MauiAppCompatActivity activity)
{
activity.MoveTaskToBack(true);
return new NavigationResult();
}
#endif
throw new NavigationException(NavigationException.CannotPopApplicationMainPage, page);
}
private INavigationResult Notify(NavigationRequestType type, INavigationParameters parameters, Exception exception = null)
{
var result = new NavigationResult(exception);
_eventAggregator.GetEvent<NavigationRequestEvent>().Publish(new NavigationRequestContext
{
Parameters = parameters,
Result = result,
Type = type,
});
return result;
}
private INavigationResult Notify(Uri uri, INavigationParameters parameters, Exception exception = null)
{
var result = new NavigationResult(exception);View on GitHub (pinned to 358118cd64)