Xamarin — Shell.Текущий.GoToAsync и кнопка возврата

#android #xamarin #xamarin.forms

#Android #xamarin #xamarin.forms

Вопрос:

Я работаю над своим самым первым приложением Xamarin Forms и сталкиваюсь с некоторыми проблемами, связанными с навигацией. У меня есть страница просмотра домашней страницы, на которой есть 3 кнопки, которые пытаются перейти к 3 разным представлениям (давайте назовем их AboutPage, SearchResultsPage и ScanPage). Каждое представление (включая домашнее) имеет свою собственную ViewModel и свои собственные файлы Xaml, и все они определяются как ContentPages.

Домашняя страница.xaml:

                 <Button x:Name="About" Grid.Row="2" Grid.Column="1" FontSize="Large" HorizontalOptions="Start"
                Text="About this app" Clicked="About_Clicked" VerticalOptions="Center" 
                    BackgroundColor="{StaticResource Primary}"
                    TextColor="White" />
  

Домашняя страница.cs:

 private async void About_Clicked(object sender, EventArgs e)
{
   await Shell.Current.GoToAsync($"//AboutPage");
}
  

Также в моем AppShell у меня есть вся маршрутизация, определенная:

Оболочка приложения.cs

     public AppShell()
    {
        InitializeComponent();
        Routing.RegisterRoute(nameof(HomePage), typeof(HomePage));
        Routing.RegisterRoute(nameof(AboutPage), typeof(AboutPage));
        Routing.RegisterRoute(nameof(SearchPage), typeof(SearchResultsPage));
        Routing.RegisterRoute(nameof(ScanPage), typeof(ScanPage));
}
  

И вот мой AppShell.xaml

 <TabBar x:Name="tabBar">
    <ShellContent Icon="home.png" Route="HomePage" ContentTemplate="{DataTemplate local:HomePage}"  />
    <ShellContent Icon="search.png" Route="SearchResultsPage" ContentTemplate="{DataTemplate local:SearchResultsPage}" />
    <ShellContent Icon="scan.png" Route="ScanPage" ContentTemplate="{DataTemplate local:ScanPage}" />

</TabBar>
<ShellContent Route="AboutPage" Shell.FlyoutBehavior="Disabled" ContentTemplate="{DataTemplate local:AboutPage}" />
  

Теперь вот когда я сталкиваюсь с проблемой: когда я нажимаю на кнопку «О программе» в главном окне, я перехожу на нужную страницу (AboutPage), НО я получаю кнопку «Назад» сверху, и когда я нажимаю ссылку «Домашний просмотр» на панели вкладок, ничего не происходит (я думаю, это потому, что представление «о программе» «перезаписывает» домашний просмотр).). И всякий раз, когда я перехожу к главному просмотру, я продолжаю получать aboutpage. Единственный способ снова получить доступ к просмотру домашней страницы — нажать кнопку «Назад» в верхней части навигации.
Однако, когда я нажимаю что-либо через панель вкладок, я получаю ожидаемое поведение перехода к представлению и возможность перехода к любому другому представлению. У меня также нигде не отображается кнопка «Назад» (ОЧЕНЬ желательное поведение для меня в его рабочем процессе, поскольку все страницы, по которым можно перемещаться, легко доступны на нижней панели вкладок).

Мой вопрос: как мне предотвратить такое поведение, когда всякий раз, когда я перехожу к другому представлению страницы содержимого, я вынужден нажимать кнопку «Назад», если я хочу получить доступ к представлению, от которого я только что перешел?

Я просто хочу иметь возможность повторить то же поведение, что и с панелью вкладок, где я могу просто «перейти» к другому просмотру страницы, и нет кнопки «Назад» или просмотров, переопределяющих махинации. Может ли это быть связано с созданием NavigationStack?

По этой ссылке говорится, что вам необходимо установить все маршруты в визуальной иерархии оболочки, и именно поэтому я добавляю туда все представления через элементы ShellContent. Будет ли этого достаточно для предотвращения стека навигации?

Заранее большое спасибо!!!

Комментарии:

1. Может ли это сработать ?

Ответ №1:

Вы имеете в виду, что хотите нажать x:Name="About" кнопку, чтобы перейти на страницу «О программе», затем нажать «Назад» в верхней части навигации, и вы вернетесь на домашнюю страницу?

Если да, вы могли бы попытаться изменить

 await Shell.Current.GoToAsync($"//AboutPage");
  

Для

 await Shell.Current.GoToAsync($"//HomePage/AboutPage");
  

Комментарии:

1. У меня это сработало, но вам тоже нужно зарегистрировать маршрут. Routing.RegisterRoute($"{nameof(HomePage)}/{nameof(AboutPage)}", typeof(AboutPage));