Регистрация дополнительных маршрутов

В приложении могут содержаться страницы, которые не требуется отображать в визуальной иерархии 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. Для перехода по дополнительным маршрутам используются относительные пути, а страницы с дополнительными маршрутами попадают в стек навигации, то позволяет нам перемещаться назад с такой страницы.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии