2017-08-09 90 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. 
    } 
} 
相關問題