#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));