Working with TabbedPages
Selecting the Initial Tab
When navigating to a TabbedPage, by default the selected tab displayed will always be the first Tab defined for the TabbedPage. In Prism, you could select a different tab by specifying the KnownNavigationParameters.SelectedTab constant or the "selctedTab" parameter name as a navigation parameter.
//using parameter name
_navigationService.NavigateAsync("MyTabbedPage?selectedTab=ViewA");
//using KnownNavigationParameters.SelectedTab constant
_navigationService.NavigateAsync($"MyTabbedPage?{KnownNavigationParameters.SelectedTab}=ViewA");
For tabs that are wrapped inside a NavigationPage, you do not need to change anything. The syntax is the same.
Creating Tabs at Runtime
To get started you will need to register the TabbedPage you wish to use (which can be the base Xamarin.Forms.TabbedPage), and any Views that you may wish to add as a Tab in your App's RegisterTypes method as shown below:
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.RegisterForNavigation<MyTabbedPage>();
containerRegistry.RegisterForNavigation<ViewA>();
containerRegistry.RegisterForNavigation<ViewB>();
}
Once you have verified your pages have been registerd, you can now dynamically create tabs when navigating to a TabbedPage by using the KnownNavigationParameters.CreateTab constant or by using the "createTab" parameter name.
//using parameter name
_navigationService.NavigateAsync("MyTabbedPage?createTab=ViewA&createTab=ViewB");
//using KnownNavigationParameters.CreateTab constant
_navigationService.NavigateAsync($"MyTabbedPage?{KnownNavigationParameters.CreateTab}=ViewA&{KnownNavigationParameters.CreateTab}=ViewB");
To create a tab that wraps a page in a NavigationPage, simply denote this as a nested hierarchy using the | character.
_navigationService.NavigateAsync("MyTabbedPage?createTab=NavigationPage|ViewA");
NOTE: Dynamic tab creation is only supported from the querystring at this time, and is not supported if you were to add it to the INavigationParameters passed in to NavigateAsync.
NOTE: CarouselPages are not supported
Knowing the Selected Tab
The IActiveAware interface allows you to respond to tabs being selected/unselected in a TabbedPage. When a tab is selected and it, or it's ViewModel, implements that IActiveAware interface, the IActiveAware.IsActive property is set to either true if selected, or false if not selected.
public class TabItemViewModel : BindableBase, IActiveAware
{
// NOTE: Prism.Forms only sets IsActive, and does not do anything with the event.
public event EventHandler IsActiveChanged;
private bool _isActive;
public bool IsActive
{
get { return _isActive; }
set { SetProperty(ref _isActive, value, RaiseIsActiveChanged); }
}
protected virtual void RaiseIsActiveChanged()
{
IsActiveChanged?.Invoke(this, EventArgs.Empty);
}
}