Используя навигацию 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.