Содержание
Приложения .NET MAUI с Shell
могут осуществлять отложенный переход, то есть давать пользователю возможность выбора — перейти на страницу или нет, или выполнить перед переходом какую-либо работу.
Отложенный переход
Чтобы осуществить отложенный переход, необходимо переопределить метод OnNavigationg()
оболочки Shell
, который выглядит следующим образом:
protected virtual void OnNavigating(ShellNavigatingEventArgs args);
где ShellNavigatingEventArgs
— это класс
public class ShellNavigatingEventArgs : EventArgs
со следующими свойствами:
Свойство | Тип | Описание | |
Can |
bool |
Значение, указывающее, возможно ли отменить переход на страницу Target |
|
Cancelled |
bool |
Значение, указывающее, был ли отменен переход | |
Current |
ShellNavigationState |
URI текущей страницы | |
Source |
ShellNavigationSource |
Тип выполненной операции. Перечисление (enum ):
|
|
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
)