Skip to content

Shell | Navigation

All navigation in Shiny Shell goes through the INavigator interface. Inject it into your ViewModels via constructor injection.

public class MyViewModel(INavigator navigator)
{
// navigator is ready to use
}

Navigate to a registered route by name, optionally passing arguments as key-value tuples.

// Simple route navigation
await navigator.NavigateTo("details");
// With arguments
await navigator.NavigateTo("details", ("Id", 42), ("Name", "Allan"));

Arguments are received on the target ViewModel via IQueryAttributable.ApplyQueryAttributes.

Navigate by ViewModel type with an optional configuration action for strongly-typed argument passing.

// Navigate to a ViewModel
await navigator.NavigateTo<DetailViewModel>();
// With strongly-typed property setup
await navigator.NavigateTo<DetailViewModel>(vm => vm.Id = 42);
// With additional route arguments
await navigator.NavigateTo<DetailViewModel>(
vm => vm.Id = 42,
("ExtraArg", "value")
);

Replace the navigation stack with a new root ViewModel.

// Set a new root
await navigator.SetRoot<HomeViewModel>();
// With configuration
await navigator.SetRoot<HomeViewModel>(vm => vm.WelcomeMessage = "Hello!");

Navigate back one or more pages, optionally passing arguments to the previous ViewModel.

// Simple go back
await navigator.GoBack();
// Go back with arguments
await navigator.GoBack(("Result", "saved"), ("Timestamp", DateTime.UtcNow));
// Go back multiple pages
await navigator.GoBack(2);
// Go back multiple pages with arguments
await navigator.GoBack(2, ("Result", "saved"));

Pop the entire navigation stack back to the root page.

await navigator.PopToRoot();
// With arguments
await navigator.PopToRoot(("Status", "complete"));

Display a simple alert dialog.

await navigator.Alert("Error", "Something went wrong", "OK");
ParameterTypeDescription
titlestringAlert title
messagestringAlert body text
acceptTextstringButton text (default: “OK”)

Display a confirmation dialog and return the user’s choice.

bool confirmed = await navigator.Confirm(
"Delete Item",
"Are you sure you want to delete this?",
"Delete",
"Cancel"
);
if (confirmed)
{
// proceed with deletion
}
ParameterTypeDescription
titlestringDialog title
messagestringDialog body text
acceptTextstringAccept button text (default: “OK”)
cancelTextstringCancel button text (default: “Cancel”)

Arguments passed during navigation are delivered via the MAUI built-in IQueryAttributable interface.

public class DetailViewModel : IQueryAttributable
{
public int Id { get; set; }
public void ApplyQueryAttributes(IDictionary<string, object> query)
{
if (query.TryGetValue("Id", out var id))
Id = (int)id;
}
}

This works for arguments passed via NavigateTo, GoBack, and PopToRoot.