Измените выбранный пункт меню во всплывающем меню оболочки во время навигации по коду.
В моем приложении Maui есть всплывающее меню оболочки, и для навигации я также использую маршрутизацию по коду.
<!--On AppShell.xaml-->
<ShellContent
Title="My Page"
ContentTemplate="{DataTemplate views:MyPage}" />
//on AppShell.xaml.cs
Routing.RegisterRoute(nameof(MyPage), typeof(MyPage));
//On MyPageViewModel
//Command using CommunityToolKit.MVVM
[RelayCommand]
async Task GoToMyPage()
{
await Shell.Current.GoToAsync(nameof(MyPage));
}
Если я перемещаюсь по меню, поведение меню соответствует ожиданиям: выбранный пункт меню меняется на текущую страницу, но когда я перемещаюсь по коду, выбранное меню остается на предыдущей странице.
Я хотел бы сохранить стек навигации, чтобы позволить пользователю вернуться на предыдущую страницу с помощью кнопки возврата, но я также хотел бы изменить выбранный пункт меню на текущую страницу , чтобы показать выделенную текущую страницу , но также и разрешить Пользователь может выбрать эту начальную страницу через меню навигации .
Для справки по следующему объяснению давайте представим себе 3 страницы: InitialPage MyPage RandomPage :
В настоящее время, если я уже перешел с помощью кода из InitialPage в MyPage и попытаюсь выбрать InitialPage в меню, он не отвечает, потому что он выбран, и если я перейду на RandomPage через меню и снова перейду на InitialPage , это приведет меня к MyPage (потому что Я предполагаю, что это последнее в стеке навигации).
Я хочу, чтобы при первом переключении на MyPage выбранный элемент в меню отражал это изменение страницы, а когда я возвращаюсь к InitialPage через меню, я хочу перейти к InitialPage .
Меня не волнует, сбрасывается ли стек навигации при возврате к InitalPage или к нему добавляется навигация, например: { InitialPage , MyPage , InitialPage }.
Что мне следует изменить или добавить, чтобы достичь того, что я объяснил выше?
1 ответ
Я уверен, что вы нашли ответ на эту проблему, но я собираюсь опубликовать это здесь, чтобы помочь всем, кто может столкнуться с той же проблемой. Я только что потратил большую часть полутора часов на поиски решения.
Я столкнулся с той же проблемой, что описана в исходном вопросе. У меня это оказалось связано с тем, что я прописывал все свои маршруты в AppShell.xaml.cs вот так:
Routing.RegisterRoute(nameof(MainView), typeof(MainView));
Routing.RegisterRoute(nameof(SomeView), typeof(SomeView));
Routing.RegisterRoute(nameof(SomeOtherView), typeof(SomeOtherView));
Routing.RegisterRoute(nameof(YetAnotherView), typeof(YetAnotherView));
Routing.RegisterRoute(nameof(OneMoreView), typeof(OneMoreView));
Routing.RegisterRoute(nameof(LastView), typeof(LastView));
Это было нормально для страниц, которые не были частью моего всплывающего меню, но при использовании
Когда я впервые создавал всплывающее меню для своего приложения, у меня были зарегистрированы маршруты, как в приведенном выше коде C#, и
Чтобы это исправить, удалите регистрацию маршрутов C# в AppShell.xaml.cs для элементов всплывающего меню и добавьте маршруты для этих элементов всплывающего меню непосредственно в определения XAML, созданные вами в файле AppShell.xaml . Так:
<!-- We want our FlyoutItem routes defined here, and ONLY here. -->
<FlyoutItem Title="Home">
<ShellContent
ContentTemplate="{DataTemplate local:MainView}"
Route="MainView" />
</FlyoutItem>
<FlyoutItem Title="Some View">
<ShellContent
ContentTemplate="{DataTemplate local:SomeView}"
Route="SomeView" />
</FlyoutItem>
<FlyoutItem Title="Some Other View">
<ShellContent
ContentTemplate="{DataTemplate local:SomeOtherView}"
Route="SomeOtherView" />
</FlyoutItem>
Используя приведенный выше макет кода программной части, наш AppShell.xaml.cs теперь будет выглядеть так:
// We still want to keep our other route registrations
Routing.RegisterRoute(nameof(YetAnotherView), typeof(YetAnotherView));
Routing.RegisterRoute(nameof(OneMoreView), typeof(OneMoreView));
Routing.RegisterRoute(nameof(LastView), typeof(LastView));
Когда я удалил регистрацию маршрутов с выделенным кодом и добавил