How-To: Navigate Between Pages
This topic covers using Navigation to navigate between two pages using frame-based navigation.
Step-by-steps
Important
This guide assumes you used the template wizard or dotnet new unoapp to create your solution. If not, it is recommended that you follow the instructions for creating an application from the template.
1. Navigating to a New Page
- Add a new - Pageto navigate to,- SamplePage.xaml, in the UI (shared) project
- In - MainPage.xamlreplace the existing- Buttonwith the following XAML, which includes a handler for the Click event- <Button Content="Go to SamplePage" Click="GoToSamplePageClick" />
- In the - GoToSamplePageClickmethod, use the- Navigatorextension method to get a reference to an- INavigatorinstance and call- NavigateViewAsyncto navigate to the- SamplePage. This will push a new instance of the- SamplePageonto the current Frame, pushing the- MainPageto the back-stack.- private void GoToSamplePageClick(object sender, RoutedEventArgs e) { _ = this.Navigator()?.NavigateViewAsync<SamplePage>(this); }
2. Navigating Back to the Previous Page
- In - SamplePage.xamladd a- Buttonwith a handler for the- Clickevent- <Button Content="Go Back" Click="GoBackClick" />
- Again, use the - Navigatorextension method to access the- INavigatorinstance and call- NavigateBackAsync. This will cause the frame to navigate to the previous page on the back-stack and releasing the- SamplePageinstance.- private void GoBackClick(object sender, RoutedEventArgs e) { _ = this.Navigator()?.NavigateBackAsync(this); }
3. Defining ViewMap and RouteMap
At this point, if you inspect the Output window you'll see a line that says something similar to:
For better performance (avoid reflection), create mapping for for path 'Sample', view 'SamplePage', view model
This warning exists because Navigation uses reflection as a fallback mechanism to associate types and the corresponding navigation route. This can be resolved by specifying a ViewMap and a RouteMap for the SamplePage to eliminate the need for reflection
- Update the - RegisterRoutesmethod in the- App.xaml.host.csfile- private static void RegisterRoutes(IViewRegistry views, IRouteRegistry routes) { views.Register( new ViewMap<ShellControl,ShellViewModel>(), new ViewMap<MainPage, MainViewModel>(), new ViewMap<SecondPage, SecondViewModel>(), new ViewMap<SamplePage>() ); routes.Register( new RouteMap("", View: views.FindByViewModel<ShellViewModel>() , Nested: new RouteMap[] { new RouteMap("Main", View: views.FindByViewModel<MainViewModel>()), new RouteMap("Second", View: views.FindByViewModel<SecondViewModel>()), new RouteMap("Sample", View: views.FindByView<SamplePage>()), })); }
4. Associating a View Model
By defining a ViewMap that associates a view with a view model, an instance of the view model can dynamically be created and is subsequently set as the DataContext on the view that's navigated to.
- Create a new class - SampleViewModelin the ViewModels folder of the class library project- public class SampleViewModel { public string Title => "Sample Page"; public SampleViewModel() { } }
- Update - ViewMapin- App.xaml.host.csto include- SampleViewModel- new ViewMap<SamplePage, SampleViewModel>()
- Add - TextBlockto the- SamplePage.xamland data bind to the- Titleproperty- <TextBlock Text="{Binding Title}" />
5. Navigating via View Models
The Navigation code can be moved from the SamplePage.cs code-behind file to the SampleViewModel.
- Update - SampleViewModelto take a constructor dependency on- INavigatorand add a- GoBackmethod that will call the- NavigateBackAsyncmethod- private readonly INavigator _navigator; public SampleViewModel(INavigator navigator) { _navigator = navigator; } public Task GoBack() { return _navigator.NavigateBackAsync(this); }
- In order to use - x:Bindto invoke the- GoBackmethod on the- SampleViewModelthe- SamplePageneeds to expose a property that returns the- DataContextas a- SampleViewModel.- public SampleViewModel? ViewModel => DataContext as SampleViewModel; public SamplePage() { this.InitializeComponent(); }
- Update the - Buttonin- SamplePage.xamlto set the- Clickmethod to- x:Bindto the- GoBackmethod- <Button Content="Go Back (View Model)" Click="{x:Bind ViewModel.GoBack}" />