Easily implement a NavigationView!
First Add a NavigationView with your Items:
<NavigationView x:Name="NavView">
<NavigationView.MenuItems>
<NavigationViewItem dev:NavigationServiceEx.NavigateTo="views:BlankPage1"
Content="Page 1" />
<NavigationViewItem dev:NavigationServiceEx.NavigateTo="views:BlankPage2"
Content="Page 2" />
<NavigationViewItem dev:NavigationServiceEx.NavigateTo="views:BlankPage3"
Content="Page 3" />
</NavigationView.MenuItems>
<Frame x:Name="NavFrame"/>
</NavigationView>WARNING
NavigationServiceEx.NavigateTo attached property allows each NavigationViewItem to define the destination page directly in XAML. It simplifies navigation by binding menu items to specific views without requiring explicit event handlers.
then Create a new INavigationServiceEx:
INavigationServiceEx navigationService;
navigationService = new NavigationServiceEx();now you should call Initialize method with a NavigationView and Frame
navigationService.Initialize(NavView, NavFrame);NavigateToCommand
You can use a predefined command for navigating between pages. To do this, define a CommandParameter using the NavigationParameter markup extension, specifying the target page and the BreadCrumbNavigator header (if using ConfigureBreadCrumbNavigator). Additionally, you can set a NavigationTransitionInfo to customize the transition effect.
<Button Content="Navigate" Command="{x:Bind local:App.Current.NavService.NavigateToCommand}"
CommandParameter="{dev:NavigationParameter PageType=views:GeneralSettingPage, BreadCrumbHeader='General'}" />Configs
there are some configure methods:
ConfigureDefaultPage
set Default page for NavigationView
Initializ(...).ConfigureDefaultPage(typeof(HomeLandingsPage));ConfigureSettingsPage
set Settings page for NavigationView
Initializ(...).ConfigureSettingsPage(typeof(GeneralPage));ConfigureBreadcrumbBar
You should have a PageDictionary like this, which you can define your pages:
public Dictionary<Type, BreadcrumbPageConfig> PageDictionary = new()
{
{typeof(BlankPage1), new BreadcrumbPageConfig { PageTitle = "Page 1", IsHeaderVisible = true, ClearNavigation = false}},
{typeof(BlankPage2), new BreadcrumbPageConfig { PageTitle = "Page 2", IsHeaderVisible = true, ClearNavigation = false}},
{typeof(BlankPage3), new BreadcrumbPageConfig { PageTitle = "Page 3", IsHeaderVisible = true, ClearNavigation = false}},
};it is better to place BreadcrumbNavigator in NavigationView.Header
<NavigationView.Header>
<dev:BreadcrumbNavigator x:Name="BreadCrumbNav" />
</NavigationView.Header>Now Call ConfigureBreadcrumbBar method:
Initializ(...).ConfigureBreadcrumbBar(BreadCrumbNav, NavigationPageMappings.PageDictionary);use dev:BreadcrumbNavigator.PageTitle and dev:BreadcrumbNavigator.IsHeaderVisible attached properties on your pages, for Title and Header visiblity.
Source Generator
You can simplify creating PageDictionary by installing our DevWinUI.SourceGenerator nuget package.
1.Install nuget package Install-Package DevWinUI.SourceGenerator
2.Just add an AdditionalFiles entry to your csproj.
<ItemGroup>
<AdditionalFiles Include="**\*.xaml" Link="%(RecursiveDir)%(Filename)%(Extension)"/>
</ItemGroup>ConfigureTitleBar
you can use ConfigureTitleBar to automatically handle BackButton and PaneToggleButton
Initializ(...).ConfigureTitleBar(AppTitleBar);
Complete Codes
INavigationServiceEx navigationService;
navigationService = new NavigationServiceEx();
navigationService.Initialize(NavView, NavFrame)
.ConfigureDefaultPage(typeof(HomeLandingPage))
.ConfigureSettingsPage(typeof(SettingsPage))
.ConfigureBreadcrumbBar(BreadCrumbNav, BreadcrumbPageMappings.PageDictionary);MVVM Pattern
first register a INavigationServiceEx service:
services.AddSingleton<INavigationServiceEx, NavigationServiceEx>();then:
public MainPage()
{
this.InitializeComponent();
var navService = App.GetService<INavigationServiceEx>() as NavigationServiceEx;
navService.Initialize(NavView, NavFrame)
.ConfigureDefaultPage(typeof(HomeLandingPage))
.ConfigureSettingsPage(typeof(SettingsPage));
}INavigationAwareEx
you can use INavigationAwareEx in your ViewModel and you can access to OnNavigatedFrom and OnNavigatedTo methods.
public partial class myViewModel : INavigationAwareEx
public void OnNavigatedFrom()
{
}
public async void OnNavigatedTo(object parameter)
{
}WARNING
you should set DataContext, otherwise you cant use this interface.
public myViewModel ViewModel {get;}
public BlankPage()
{
ViewModel = App.GetService<myViewModel>();
DataContext = ViewModel;
this.InitializeComponent();
}Notes
WARNING
If you want to use Frame.GoBack to navigate back in the frame while maintaining the correct NavigationViewItem selection, you should use NavigationServiceEx.GoBack instead. This ensures that the NavigationView stays in sync with the current page.
Demo
you can run demo and see this feature.
