Измените выбранный пункт меню во всплывающем меню оболочки во время навигации по коду.

В моем приложении 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#, и определено для того, что было в моих определениях всплывающего меню в XAML. Что касается меня, мне пришлось удалить эти определения маршрутов в моемразметки, потому что компилятор жаловался на это, выбрасывая исключение (извините, но я не помню точное исключение... но я думаю, что он жаловался на дублирующиеся маршруты или что-то в этом роде). Я думал, что регистрация этих маршрутов одинакова в XAML и коде программной части C#, поэтому я решил оставить C# и отказаться от XAML. Это была моя ошибка; Они не одинаковы.

Чтобы это исправить, удалите регистрацию маршрутов 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));

Когда я удалил регистрацию маршрутов с выделенным кодом и добавилв моем файле XAML, все работало нормально. Надеюсь, это кому-то поможет!

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