android - Xamarin - Shell.Current.GoToAsync 和后退按钮
问题描述
我正在开发我的第一个 Xamarin Forms 应用程序,并且遇到了一些与导航相关的问题。我有一个 HomePage viewpage,它有 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 上,我定义了所有路由:
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)但是,当我点击主页视图链接时,我得到了后退按钮在标签栏上没有任何反应(我认为这是因为关于视图是“覆盖”主视图)。每当我导航到主页视图时,我都会不断获得关于页面。能够再次访问主页视图的唯一方法是点击顶部导航上的后退按钮。然而,当我通过标签栏点击任何东西时,我确实得到了进入视图的预期行为,并且能够导航到任何其他视图。我也没有在任何地方显示后退按钮(在他的工作流程中对我来说这是非常理想的行为,因为可以在底部标签栏上轻松访问所有可以导航的页面)。
我的问题是:如何防止这种行为,每当我导航到不同的内容页面视图时,如果我希望能够访问刚刚导航离开的视图,我必须点击后退按钮?
我只想能够复制与标签栏相同的行为,我可以“转到”不同的页面浏览,并且没有任何后退按钮或视图覆盖恶作剧。这可能与 NavigationStack 创建有关吗?
从这个链接它说您需要在 Shell Visual Hierarchy 上建立所有路由,这就是为什么我通过 ShellContent 项添加所有视图的原因。这足以阻止导航堆栈吗?
非常感谢提前!!!
解决方案
你的意思是你想点击 x:Name="About"
按钮导航到关于页面,然后在顶部导航中按返回,它会回到主页?
如果是的话,你可以尝试改变
await Shell.Current.GoToAsync($"//AboutPage");
至
await Shell.Current.GoToAsync($"//HomePage/AboutPage");
推荐阅读
- asp.net-core - .Net Core 5 中的自定义授权属性
- python - 通过在列表之间映射值来创建列表
- amazon-web-services - 有什么方法可以像 Microsoft Learn 中那样使用 AWS/Azure 创建限时 Windows 沙盒?
- html - 每当单击按钮时如何阻止页面向上滚动?
- docker - 如何在终端中查看命令,从 vs code 命令托盘运行
- docker - 如何从客户端访问 google kubernetes 引擎服务
- discord - 如何访问我的机器人正在运行的当前公会名称和 ID?
- ffmpeg - 将 PRORES 视频上的音频 5.1 正确转换为立体声音频
- android-studio - 通过数组列表在 google mapfragment 上显示多个标记
- rust - 如何返回 &str,避免“借用时临时价值下降”