我正在创建一个多页面Xamarin应用程序,该应用程序允许用户登录并查看该用户的位置。
我能够显示登录屏幕,但是用户可以通过调用本地数据库来登录,但是当我尝试使用Navigation.PushAsync
转到下一页时,尽管点击了下一页的构造方法,但没有进行任何操作似乎发生了。
我相信这可能与此处的这段代码有关。
Login.xaml.cs
public Login()
{
_Login login = new _Login();
this.BindingContext = login;
InitializeComponent();
}
我已经将Login
页面设置为App.xaml.cs
的主页,但是在构造函数中,我将绑定上下文设置为名为_login的类。此类为用户获取并设置用户登录时的电子邮件和密码,并取消调用外部解决方案以访问sql数据库。 (这一切都正常工作)。
在login
按钮上,如下所示:
Login.xaml
<Button Command="{Binding SubmitCommand}"
Text="Login"
FontAttributes="Bold"
FontSize="Large"></Button>
点击哪个会调用SubmitCommand
函数,如下所示:
_login.cs
public async void OnSubmit()
{
SignInResponse response = await _clientBl.SignInAsync(Email, Password);
Login login = new Login();
if(response.WasSuccessful == true)
{
login.LoginSuccessful(response.User);
}
else
{
// Show error alert
}
}
如果成功,将在 Login.xaml.cs
中调用一个函数 public async void LoginSuccessful(ApplicationUser user)
{
// Go to home page
await Navigation.PushAsync(new MainPage
{
BindingContext = user
});
}
只需推送一个新页面并将绑定上下文设置为用户的上下文。该代码会在 MainPage.xaml.cs 中访问构造函数,但是该页面从未加载过。主页包含一个带有列表视图的堆栈布局
<StackLayout>
<ListView ItemsSource="{Binding Locations}"
ItemSelected="Locations_ItemSelected"
x:Name="listView">
<ListView.RowHeight>
<OnPlatform x:TypeArguments="x:Int32">
<On Platform="iOS">100</On>
<On Platform="Android">100</On>
</OnPlatform>
</ListView.RowHeight>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="100"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"></ColumnDefinition>
<ColumnDefinition Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="{Binding Image}"
Aspect="AspectFill" Grid.ColumnSpan="2"></Image>
<Label Margin="5"
Text="{Binding Name}"
VerticalTextAlignment="Center"
HorizontalTextAlignment="Start"
Grid.Row="0"
Grid.Column="0"
TextColor="White"
FontSize="25"></Label>
<Label Text="{Binding LocationID}"
IsVisible="False"></Label>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
通过覆盖OnAppear()
函数填充的。问题可能是我正在向该页面发送ApplicationUser
,并且它试图将该页面中的属性绑定到该类吗?
我确实尝试将Navigation.PushAsync
替换为await Navigation.PushAsync(new MainPage());
,但是它仍然没有显示下一页。
答案 0 :(得分:2)
在这里您将创建“登录”页面的新实例。您要使用已经显示给用户的EXISITNG实例
Login login = new Login();
if(response.WasSuccessful == true)
{
login.LoginSuccessful(response.User);
有很多方法可以解决这个问题,但最简单的方法可能是
var login = (Login)Application.Current.MainPage;
if(response.WasSuccessful == true)
{
login.LoginSuccessful(response.User);
或者如果您的MainPage
是NavigationPage
var nav = (NavigationPage)Application.Current.MainPage;
var login = (Login)nav.CurrentPage;
答案 1 :(得分:0)
很可能是从您描述的行为(并查看代码)开始,这听起来像是因为PushAsync没有在UI线程上运行,这导致应用程序将页面加载到单独的线程上。因此,您的应用可能只是在另一个线程上启动页面。
尝试将其更改为以下内容:
Device.BeginInvokeOnMainThread(() =>
{
Navigation.PushAsync(new MainPage
{
BindingContext = user
});
});
让我知道这是否合理。
答案 2 :(得分:0)
就我而言,发生这种情况是因为我不小心将登录页面作为模态推送到导航堆栈上。在那个(模态)登录页面上,我有一个“注册”按钮,它触发了导航堆栈上的 pushAsync。该页面“未显示”,尽管我在调试时在导航堆栈上看到了它,因为模态仍然在其上方。
这种情况下的解决方案是简单地不将登录页面作为模态推送到导航堆栈上。