В приложении могут содержаться страницы, которые не требуется отображать в визуальной иерархии Shell. К таким страницам, например, относятся страницы с детальными сведениями об объектах или страницы для редактирования объектов и так далее. Регистрация дополнительных маршрутов в .NET MAUI позволяет связать страницу приложения с её маршрутом, не помещая страницу в визуальную иерархию элемента Shell.
Регистрация дополнительных маршрутов в .NET MAUI
Регистрация дополнительных маршрутов может осуществляться в любом месте приложения перед вызовом маршрута. Например, мы можем зарегистрировать маршрут в конструкторе класса AppShell. Чтобы это сделать, нам необходимо использовать метод RegisterRoute() статического класса Routing. Например, в предыдущей части мы создали своб систему маршрутизации. Напомню, как выглядит XAML-код класса AppShell:
<?xml version="1.0" encoding="UTF-8" ?>
<Shell
x:Class="NavigationMAUI.AppShell"
xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:NavigationMAUI"
Shell.FlyoutBehavior="Flyout"
Title="NavigationMAUI">
<TabBar Route="pages">
<Tab Route="main"
Title="Обзор">
<ShellContent Title="Главная"
ContentTemplate="{DataTemplate local:MainPage}"
Route="home" />
</Tab>
<Tab Route="secondary"
Title="Работа с проектами">
<ShellContent Title="Проекты"
ContentTemplate="{DataTemplate local:Projects}"
Route="projects" />
</Tab>
</TabBar>
</Shell>
Допустим, мы решили добавить страницу с подробными сведениями по проекту:
Страница ProjectDetails не должна отображаться в меню приложения, но пользователь должен иметь к ней доступ из других частей приложения. Зарегистрируем для этой страницы дополнительный маршрут, изменив конструктор класса AppShell следующим образом:
public partial class AppShell : Shell
{
public AppShell()
{
InitializeComponent();
Routing.RegisterRoute("projectdetails", typeof(ProjectDetails));
}
}
Здесь мы связали маршрут «projectdetails» со страницей ProjectDetails. Маршруты для таких страниц называются глобальными маршрутами. Теперь мы можем осуществить навигацию к этой странице, используя её URI.
Навигация по глобальным маршрутам
Добавим на страницу Projects кнопку
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="NavigationMAUI.MainPage"
Appearing="OnAppearing">
<VerticalStackLayout Padding="10">
<Label x:Name="LocationLabel"/>
<Button Text="Проекты" Clicked="Button_Clicked"></Button>
</VerticalStackLayout>
</ContentPage>
Обработчик события Clicked кнопки выглядит следующим образом:
private async void Button_Clicked(object sender, EventArgs e)
{
await Shell.Current.GoToAsync("projectdetails");
}
Обратите внимание на значение параметра в методе GoToAsync() — здесь мы используем относительный маршрут. В этом примере система маршрутизации будет искать маршрут до тех пор, пока не будет найдена соответствующая страница. И здесь следует обратить внимание на следующие моменты в .NET MAUI:
- Абсолютные маршруты не работают с страницами, зарегистрированными в методе
Routing.RegisterRoute(). - Относительные маршруты не работают со страницами, определенными в AppShell.xaml.
- Только страницы, зарегистрированные с помощью метода
Routing.RegisterRoute(), могут быть добавлены в стек навигации с использованием относительных маршрутов
Первые два пункта легко проверить, например, попытавшись выполнить вот такой переход:
await Shell.Current.GoToAsync("pages/secondary/projects");
Здесь мы пытаемся использовать относительный путь для страницы, которая определена в AppShell.xaml. В итоге мы получим вот такую ошибку:
Аналогичная ситуация произойдет, если мы попытаемся использовать абсолютный путь для дополнительной страницы:
await Shell.Current.GoToAsync("//projectsdetails");
Что касается добавления страницы в стек навигации, то обратите внимание на то, что когда мв переходим по страницам из AppShell, то на странице отсутствует кнопка «Назад», но появляется, если переход осуществляется на дополнительную страницу:
То есть страница попадает в стек навигации и мы можем использовать её для перехода назад.
Итого
Для регистрации дополнительных маршрутов используется метод RegisterRoute()статического класса Routing. Для перехода по дополнительным маршрутам используются относительные пути, а страницы с дополнительными маршрутами попадают в стек навигации, то позволяет нам перемещаться назад с такой страницы.

