-
Notifications
You must be signed in to change notification settings - Fork 37
FormsNavigationPageService
The FormsNavigationPageService
provides a simple implementation of the INavigationService interface by using the built-in Xamarin.Forms NavigationPage
support.
Pages are identified with string-based keys - typically stored as constants in a class. You register a creator delegate function that returns a Page
with the service and when the app requests to navigate to the given page-key, the delegate is called to return the page. That delegate could create a new page, return an existing page, or even cancel the navigation and perform some other action such as manipulate the MasterDetailPage
.
To use this service, you must do several things:
- Register it as the implementation for
INavigationService
. This is typically done in theApp
constructor. - Have a
NavigationPage
either as theMainPage
, or as the first child of aMasterDetailPage
. - Register the pages you want to navigate to.
- Use the service to request navigation
You can either call the static XamUInfrastructure.Init
method to register the service, or register it yourself through your own container. Here's an example of manually registering the service with the built-in DependencyService
:
public class App
{
public App()
{
XamarinUniversity.Services.XamUInfrastructure.Init();
...
}
}
or:
public class App
{
public App()
{
DependencyService.Register<INavigationService, FormsNavigationPageService>();
...
}
}
The Application main page must be a NavigationPage
, or you can use a MasterDetailPage
where either the Master
or Detail
property is set to a NavigationPage
. It checks Master
first.
You must register each unique page you want to navigate to with the service. This is commonly done in the App
constructor. The RegisterPage
method takes an object-based key and a delegate which will be called when a navigation is requested to that key - it must return a Page
or null
to cancel the navigation request and do nothing. If a Page
is returned, then the class will use the Forms INavigation
interface to navigate to the specified page.
Note: RegisterPage
is not exposed on the interface to avoid the exposure of the Page
type to the users of the abstraction. You must cast the returned interface to the implementation type to register your pages.
public enum AppPages
{
Page1,
Page2,
...
}
public class App
{
public App()
{
DependencyService.Register<INavigationService,StackNavigationService>() as StackNavigationService;
...
MasterDetailPage mdPage = ...;
INavigationService navService = DependencyService.Get<INavigationService>();
navService.RegisterPage(AppPages.Page1, () => new Page1());
navService.RegisterPage(AppPages.Page2, () => { mdPage.IsPresented = false; return null; });
...
}
}
Finally, in your VMs (or anywhere in your app) you can use the INavigationService
to do the navigation using the registered page keys. You can also pass in an optional BindingContext
for the page.
public class MyViewModel
{
IDependencyService ds;
async Task OnShowPage1Async() {
// Use "SelectedItem" property value as the BindingContext for this new page.
await ds.Get<INavigationService>().NavigateAsync(AppPages.Page1, SelectedItem);
}
}