Navigation in Universal Windows Platform (UWP) apps
Effective navigation is crucial for a good user experience in UWP applications. It allows users to move seamlessly between different sections and content within your app. UWP provides several built-in mechanisms and patterns to handle navigation.
Core Navigation Concepts
Frame Control
The Frame
control is the cornerstone of navigation in UWP. It acts as a container for pages and manages the history of pages visited, allowing users to navigate back and forward.
You typically have a single Frame
in your main window or shell, and you navigate to different Page
objects within it.
<Frame x:Name="ContentFrame" />
Page Navigation
The Frame.Navigate()
method is used to navigate to a new page. You provide the type of the page and any optional parameters.
private void NavigateToPage(Type pageType, object parameter = null)
{
if (ContentFrame.CanGoBack && ContentFrame.SourcePageType == pageType)
{
// If already on the page, navigate back to the root of the current page's stack
// to avoid duplicate entries in the back stack.
ContentFrame.BackStack.Clear();
ContentFrame.Navigate(pageType, parameter);
}
else
{
ContentFrame.Navigate(pageType, parameter);
}
}
Navigation Events
The Frame
control exposes several events that allow you to hook into the navigation process, such as NavigatingNavigate
, Navigated
, and NavigationFailed
.
Common Navigation Patterns
Top-Level Navigation (Hamburger Menu, Tabs)
For apps with distinct sections, a common pattern is a navigation drawer (Hamburger menu) or a tabbed interface. This allows users to quickly switch between major areas of your application.
Hamburger Menu: Typically implemented using a NavigationView
control, which provides built-in support for a sliding menu.
Tabs: Can be implemented using Pivot
or CommandBar
controls with AppBarButton
s.
In-Page Navigation
Within a specific page, you might have links or buttons that navigate to other related pages or display specific content. This is achieved using the same Frame.Navigate()
method.
Navigation Parameters
You can pass data between pages during navigation using the parameter
argument of the Navigate()
method. The target page can then retrieve this data in its OnNavigatedTo()
event handler.
// Sending data
ContentFrame.Navigate(typeof(DetailPage), item);
// Receiving data in the target page
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
var selectedItem = e.Parameter as MyDataItem;
if (selectedItem != null)
{
// Use selectedItem to populate the page
}
}
Navigation State Management
UWP apps should preserve their navigation state across sessions. The Frame
control automatically handles saving and restoring its back stack. For more complex state management, consider using mechanisms like `Application.Current.SessionState` or custom serialization.
Navigation Libraries and Frameworks
While UWP's built-in navigation is powerful, several MVVM-friendly navigation frameworks can simplify complex navigation scenarios, particularly for larger applications. Popular choices include:
- Microsoft.Toolkit.Mvvm.Navigation (part of Windows Community Toolkit)
- Prism
Best Practices
- Keep it simple: Avoid deep navigation hierarchies that can confuse users.
- Consistent placement: Place navigation controls in predictable locations.
- Clear labels: Use descriptive text for navigation links and buttons.
- Visual feedback: Indicate the current active page clearly.
- Handle back button: Ensure the system back button (on devices or in the OS shell) works as expected.
By understanding and applying these concepts and patterns, you can create intuitive and efficient navigation experiences for your UWP applications.