Используя навигацию Maui Shell, как переместить страницу?

Я реализую приложение Maui, используя навигацию Shell. У меня настроена иерархия навигации, я понимаю, как переходить с одной страницы на другую с помощью маршрутов страниц.

Однако у меня есть страница, которую можно открыть с нескольких исходных страниц, назовем ее ItemDetailsPage. На нескольких исходных страницах, где я отображаю элементы, всякий раз, когда я нажимаю на элемент, я перехожу к ItemDetailsPage. Все идет нормально. Чтобы перейти к ItemDetailsPage, я выполняю Shell.Current.GoToAsync(state, animate, аргументы). Обратите внимание, что для передачи аргументов я использую метод передачи аргументов IQueryAttributable.

НО, когда я нажимаю кнопку «ОК» на ItemDetailsPage, я хочу вернуться обратно на исходную страницу (которая может представлять собой несколько разных исходных страниц). Для этого я использую Shell.Current.Navigation.PopAsync(). Но следующая страница в стеке навигации — это не исходная страница, откуда я пришел, а родительская в иерархии навигации, поскольку навигация оболочки установила ее, когда я использовал GoToAsync() для перехода к ItemDetailsPage.

Я мог бы изменить навигацию source => ItemDetailsPage, чтобы использовать Shell.Current.Navigation.PushAsync(), но PushAsync не поддерживает передачу аргументов (способ IQueryAttributable), поэтому таким образом я не смог передать никаких аргументов.

Есть ли шанс, что PushAsync сможет поддерживать цели IQueryAttributable?

Есть ли другой способ поместить исходную страницу в стек навигации, чтобы нажатие ItemDetailsPage привело меня туда?

В крайнем случае я должен вернуться к другому методу передачи аргументов, но остальная часть приложения использует этот шаблон, поэтому было бы неплохо придерживаться IQueryableAttribute.

1 ответ

Я нашел два довольно простых решения.
а.) Хитрый способ — использование нескольких маршрутов навигации.
Зарегистрируйте несколько маршрутов навигации, таких как source1/ItemDetailsPage, source2/ItemDetailsPage и т. д., используйте один из них при переходе к ItemDetailsPage. Затем навигация оболочки поместит источник1, источник2 и т. д. в стек навигации, а обратный переход фактически перейдет к источнику1, источнику2 и т. д. Протестировано, работает, приведу пример.
б.) Правильный, но трудоёмкий способ — использование действий обратной навигации.
При переходе к ItemDetailsPage передайте дополнительный аргумент, который является методом, реализующим возврат к источнику. Не проверял, думаю, это сработает, но для возврата назад придется включить передачу аргументов, заново построить страницу и т. д.

Подробности а.), несколько маршрутов навигации
в AppShell.xaml.cs

      public const string AlternateRoute1 = $"{Source1Route}/{nameof(ItemDetailsPage)}";
public const string AlternateRoute2 = $"{Source2Route}/{nameof(ItemDetailsPage)}";

public AppShell()
{
    [...]
    Routing.RegisterRoute(AlternateRoute1, typeof(ItemDetailsPage));
    Routing.RegisterRoute(AlternateRoute2, typeof(ItemDetailsPage));
}

При переходе со страницы 1 используйте AlternateRoute1, а со страницы 2 — AlternateRoute2.

При закрытии ItemDetailsPage используйте

      await SafeGoToAsync("..");

и он вернется либо на страницу 1, либо на страницу 2.

Другие вопросы по тегам