2017-08-09 86 views
1

在我的Xamarin.Forms项目中,我有一个登录表单登录用户,然后将它们重定向到另一个页面。我想在尝试登录时显示一个ActivityIndi​​cator,但将IsVisible设置为true在登录功能完成之前实际上不会生效。我的代码如下所示:Xamarin.Forms设置IsVisible在函数完成之前不会触发。

void OnLoginButtonClicked(object sender, EventArgs e) 
{ 
    LoadingIndicator.IsVisible = true; 
    Login(); 
} 

public void Login() 
{ 
    var user = new User 
    { 
     Email = usernameEntry.Text, 
     Password = passwordEntry.Text 
    }; 

    User validUser = AreCredentialsCorrect(user); 
    if (validUser != null) 
    { 
     Navigation.PushAsync(new ProfilePage()); 
    } 
    else 
    { 
     messageLabel.Text = "Login failed"; 
     passwordEntry.Text = string.Empty; 
     //It will only show the LoadingIndicator at this point. 
    } 
} 

如果用户是正确的,它永远不会显示LoadingIndicator因为它导航到另一个页面,才可以证明这一点。 如果用户无效,它将仅在碰到else子句并显示“登录失败”后才显示LoadingIndicator。任何人都可以解释为什么这是,我能做些什么来解决它?

回答

1

使用异步调用并等待主要操作块。如果您想在UI中更新/更改任何内容,请使用BeginInvokeOnMainThread

void OnLoginButtonClicked(object sender, EventArgs e) 
     { 
      LoadingIndicator.IsVisible = true; 
      await Login(); 
     } 

     public async void Login() 
     { 
      await Task.Run(() => { 
      var user = new User 
      { 
       Email = usernameEntry.Text, 
       Password = passwordEntry.Text 
      }; 

      User validUser = AreCredentialsCorrect(user); 
      }).ContinueWith((a) => SomeMethod(validUser)); 
     } 

     public void SomeMethod() 
     { 
      Device.BeginInvokeOnMainThread(() => 
      if (validUser != null) 
      { 
       Navigation.PushAsync(new ProfilePage()); 
      } 
      else 
      { 
       messageLabel.Text = "Login failed"; 
       passwordEntry.Text = string.Empty; 
       //It will only show the LoadingIndicator at this point. 
      } 
      } 
     } 
+0

不错,这工作得很好。谢谢! – Fayze

0

这里有两种可能的解释,一种是它可能会重定向得太快以至于没有时间显示加载指示符,我以前遇到过这个问题。我们有一个非常好的加载符号和动画,但后来我们切换到Aurelia框架,并且它的登录速度如此之快,即使实际上它正在工作,它也没有时间显示它。至于代码更改,我会尝试将它添加到登录函数中,至少现在要给出一些清晰的说明,如果它实际上只是以很快的速度登录,它不会显示,或者根本不显示。她是我的建议。

void OnLoginButtonClicked(object sender, EventArgs e) 
{ 
    LoadingIndicator.IsVisible = true; 
    Login(LoadingIndicator.IsVisible); 
} 

public void Login(Bool IsVisible)<--- might have type wrong not familiar with you custom defines types I would expect it to be a bool though. 
IsVisible = true; 
{ 
    var user = new User 
    { 
     IsVisible = true; 
     Email = usernameEntry.Text, 
     Password = passwordEntry.Text 
    }; 

    User validUser = AreCredentialsCorrect(user); 
    if (validUser != null) 
    { 
     IsVisible = true; 
     Navigation.PushAsync(new ProfilePage()); 
    } 
    else 
    { 
     IsVisible = true; 
     messageLabel.Text = "Login failed"; 
     passwordEntry.Text = string.Empty; 
     //It will only show the LoadingIndicator at this point. 
    } 
} 

如果没有其他,这可能有助于澄清为什么它没有被显示。另外不要忘记在大多数浏览器上默认使用web调试器f12,并查找将包含指标的元素。

希望这会有所帮助!如果不让我知道,我会删除答案(我不得不使用答案,因为我不能评论50代表)干杯!

1

尝试使用async/await。允许用户界面在导航时更新。

async void OnLoginButtonClicked(object sender, EventArgs e) 
{ 
    LoadingIndicator.IsVisible = true; 
    await Login(); 
} 

public async Task Login() 
{ 
    var user = new User 
    { 
     Email = usernameEntry.Text, 
     Password = passwordEntry.Text 
    }; 

    User validUser = AreCredentialsCorrect(user); 
    if (validUser != null) 
    { 
     await Navigation.PushAsync(new ProfilePage()); 
    } 
    else 
    { 
     messageLabel.Text = "Login failed"; 
     passwordEntry.Text = string.Empty; 
     //It will only show the LoadingIndicator at this point. 
    } 
} 
相关问题