首页 > 解决方案 > 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 项添加所有视图的原因。这足以阻止导航堆栈吗?

非常感谢提前!!!

标签: androidxamarinxamarin.forms

解决方案


你的意思是你想点击 x:Name="About"按钮导航到关于页面,然后在顶部导航中按返回,它会回到主页?

如果是的话,你可以尝试改变

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

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

推荐阅读