Маршрутизация и навигация в NET MAUI. Отложенный переход

Приложения .NET MAUI с Shell могут осуществлять отложенный переход, то есть давать пользователю возможность выбора — перейти на страницу или нет, или выполнить перед переходом какую-либо работу.

Отложенный переход

Чтобы осуществить отложенный переход, необходимо переопределить метод OnNavigationg() оболочки Shell, который выглядит следующим образом:

protected virtual void OnNavigating(ShellNavigatingEventArgs args);

где ShellNavigatingEventArgs  — это класс

public class ShellNavigatingEventArgs : EventArgs

со следующими свойствами:

Свойство Тип Описание
CanCancel bool Значение, указывающее, возможно ли отменить переход на страницу Target
Cancelled bool Значение, указывающее, был ли отменен переход
Current ShellNavigationState URI текущей страницы
Source ShellNavigationSource Тип выполненной операции. Перечисление (enum):

  • Unknown
  • Push
  • Pop
  • PopToRoot
  • Insert
  • Remove
  • ShellItemChanged
  • ShellSectionChanged
  • ShellContentChanged
Target ShellNavigationState URI страницы для перехода

Также этот класс предоставляет нам два важных для нас метода:

public bool Cancel();
public ShellNavigatingDeferral GetDeferral();

где ShellNavigatingDeferral — это токен для отмены навигации. Таким образом, от нас требуется переопределить метод OnNavigationg(), получить токен отмены и использовать его для отложенной навигации. Например, воспользуемся приложением из предыдущей части и изменим файл AppShell.xaml.cs следующим образом:

public partial class AppShell : Shell
{
    public AppShell()
    {
        InitializeComponent();
    }

    protected override async void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        ShellNavigatingDeferral token = args.GetDeferral();

        var result = await DisplayActionSheet("Перейти?", "Отмена", "Да", "Нет");
        if (result != "Да")
        {
            args.Cancel();
        }
        token.Complete();
    }
}

Здесь мы воспроизвели порядок действий, описанный выше:

  • запросили токен отмены: ShellNavigatingDeferral token = args.GetDeferral();
  • предложили пользователю выбрать вариант: var result = await DisplayActionSheet("Перейти?", "Отмена", "Да", "Нет"); 
  • если пользователь выбирает вариант «Да», то мы отменяем токен (переходим по URI): args.Cancel();
  • если пользователь выбирает вариант «Нет» или «Отмена», то остаемся на текущей странице, то есть отменяем навигацию: token.Complete();

Теперь можно запустить приложение и посмотреть на результат. При каждой попытке перехода мы будем видеть следующее сообщение:

и, в зависимости от нашего выбора, либо переходить на страницу, либо оставаться на текущей. Используя параметры ShellNavigatingEventArgs, мы можем выдавать это сообщение только при попытке перехода на определенную страницу. Например:

protected override async void OnNavigating(ShellNavigatingEventArgs args)
{
    base.OnNavigating(args);

    
    if (args.Target.Location.ToString() == "//details")
    {
        ShellNavigatingDeferral token = args.GetDeferral();
        var result = await DisplayActionSheet($"Перейти на {args.Target.Location}?", "Отмена", "Да", "Нет");
        if (result != "Да")
        {
            args.Cancel();
        }
        token.Complete();
    }
    
}

Теперь, при попытке перехода на страницу с URI //details мы получим вот такое сообщение

а при переходе на все прочие страницы навигация будет осуществляться обычным образом.

Итого

Используя отложенную навигацию, мы можем отменить переход на определенную страницу, предложить пользователю выбор переходить или нет. Для этого необходимо переопределить метод OnNavigating класса-наследника Shell (в шаблонном проекте .NET MAUI — это класс AppShell)

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