【发布时间】:2021-10-11 15:18:47
【问题描述】:
我在 Visual Studio 2019 中使用 Xamarin.Forms Shell 创建了一个新应用程序。我正在尝试让导航正常工作,但我不确定为什么在调用 Shell.Current.GoToAsync 时没有任何反应。
使用 Shell Tab Bar 模板自带的 UWP 应用进行测试,我在共享库中有以下app.xaml.cs。
public partial class App : Application
{
public App()
{
InitializeComponent();
MainPage = new AppShell();
}
}
在AppShell XAML 和代码隐藏中,我为我的登录路径创建了一个ShellItem,应用程序在该路径中成功启动。我也有一个TabBar,其中有一条通往MangaLibraryPage 的路线。我也注册了我的路线。
AppShell.xaml
<?xml version="1.0" encoding="UTF-8"?>
<Shell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MangaLater.Views"
Title="MangaLater"
x:Class="MangaLater.AppShell">
<ShellItem Route="login" FlyoutItemIsVisible="False">
<ShellContent ContentTemplate="{DataTemplate local:LoginPage}" />
</ShellItem>
<TabBar>
<ShellContent Route="MangaLibraryPage" ContentTemplate="{DataTemplate local:MangaLibraryPage}" />
</TabBar>
</Shell>
AppShell.cs
public partial class AppShell : Xamarin.Forms.Shell
{
public AppShell()
{
InitializeComponent();
Routing.RegisterRoute("login", typeof(LoginPage));
Routing.RegisterRoute(nameof(MangaLibraryPage), typeof(MangaLibraryPage));
}
}
LoginPage 非常简单 - 它只有一个带有标签和按钮的网格。
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="MangaLater.Views.LoginPage"
xmlns:vm="clr-namespace:MangaLater.Views"
Shell.FlyoutBehavior="Disabled"
Shell.NavBarIsVisible="False">
<ContentPage.Content>
<Grid Padding="0, 60, 0, 0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="4*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<StackLayout x:Name="LoginStackLayout"
Grid.Column="1">
<Label Text="Login"
HorizontalOptions="Center"
Margin="0, 0, 0, 24"
FontAttributes="Bold"
FontSize="36"></Label>
<Button Text="Sign in with Google"
Grid.ColumnSpan="2"
BackgroundColor="#4285F4"
TextColor="White"
FontAttributes="Bold"
Margin="16, 8"></Button>
</StackLayout>
</Grid>
</ContentPage.Content>
</ContentPage>
我已将视图模型全部连接起来并与导航一起使用,但最近发生的一些变化破坏了它,所以我一直在慢慢删除代码,试图找出导致导航不起作用的原因。
此时我没有视图模型,我所拥有的只是试图强制导航到新页面的代码隐藏。
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class LoginPage : ContentPage
{
public LoginPage()
{
InitializeComponent();
}
protected override async void OnAppearing()
{
base.OnAppearing();
await Shell.Current.GoToAsync($"//{nameof(MangaLibraryPage)}");
}
}
当应用程序启动时,OnAppearing 会在 LoginPage 上调用两次。我上面的代码中没有任何地方明确调用,所以我不确定为什么OnAppearing 被多次调用。 GoToAsync 调用被命中并且不会抛出任何异常,但导航永远不会发生。该应用程序停留在Loginpage。这里有什么突出我做错了吗? MangaLibraryPay 的构造函数永远不会被命中,表明导航永远不会实例化它。
【问题讨论】:
-
作为测试,制作一个按钮来执行 GoToAsync。注释掉 OnAppearing 中的行。在页面的 OnAppearing 中执行此操作可能存在一些问题。如果它在按钮上起作用,那么我们就知道 shell 导航是正确的。
-
刚刚试了一下 - 添加了
OnClick事件处理程序,并且使用相同的GoToAsync调用的导航什么也没做。断点被击中,我可以跳过代码,但导航本质上是一个无操作 -
更新 - 我没有删除
OnAppearing覆盖。一旦我删除了该方法,OnClick处理程序确实会导航。它似乎与OnAppearing覆盖有关
标签: c# xamarin.forms uwp