2016-03-15 4 views
2

Я пытаюсь показать ActivityIndicator После того, как я нажимаю кнопку, когда пытаюсь обновить Column On DB, она не появляется? В чем проблема?Индикатор активности Не работает Xamarin.forms

На следующий мой код:

ActivityIndicator ai = new ActivityIndicator() 
      { 
       HorizontalOptions = LayoutOptions.CenterAndExpand, 
       Color = Color.Black 
      }; 
      ai.IsRunning = true; 
      ai.IsEnabled = true; 
      ai.BindingContext = this; 
      ai.SetBinding(ActivityIndicator.IsVisibleProperty, "IsBusy"); 

      ProcessToCheckOut = new Button { Text = "Set Inf" }; 
      ProcessToCheckOut.Clicked += (object sender, EventArgs e) => 
      { 
       this.IsBusy = true; 
       UserUpdateRequest user=new UserUpdateRequest(); 
       user.userId = CustomersPage.ID; 
       appClient.UpdateInfo(user);     
       this.IsBusy = false; 
       Navigation.PushAsync(new CheckoutShippingAddressPage(appClient)); 
      }; 
     Content = new StackLayout 
      { 
       Children={ 
       tb, 
       ai, 
       ProcessToCheckOut 
       } 
      }; 
+0

Как вы определяете IsBusy? Это свойство Bindable? – StarterPack

+0

ProcessToCheckOut - кнопка. Должен ли я добавить свойство?! –

+0

@StarterPack IsBusy встроен. Он используется для включения и выключения значка активности панели состояния, но вы также можете использовать его в своем собственном коде, как это делается здесь –

ответ

4

Без кода между this.IsBusy=true; и this.IsBusy=false; является асинхронным. Так что происходит то, что вы включаете индикатор, а затем продолжаете работать над основным потоком, а затем отключите индикатор, прежде чем пользовательский интерфейс сможет обновиться.

Чтобы исправить это, вам необходимо поместить appClient.UpdateInfo(user) в блок асинхронного кода (наряду с PushAsync и отключением индикатора активности и, возможно, другого кода). Если у вас нет асинхронной версии UpdateInfo(), вы можете оттолкнуть ее в фоновый поток ... при условии, что любая работа, которую он делает, на самом деле безопасна для работы в фоновом потоке.

ProcessToCheckOut.Clicked += (object sender, EventArgs e) => 
{ 
    this.IsBusy = true; 
    var id = CustomersPage.ID; 
    Task.Run(() => { 
     UserUpdateRequest user=new UserUpdateRequest(); 
     user.userId = id; 
     appClient.UpdateInfo(user); 
     Device.BeginInvokeOnMainThread(() => { 
      this.IsBusy = false; 
      Navigation.PushAsync(new CheckoutShippingAddressPage(appClient)); 
     }); 
    }); 
}; 

Обратите внимание, что я также использовал Device.BeginInvokeOnMainThread() маршал исполнения обратно в основной поток, как только фон работа. Это не всегда необходимо, но это хорошая практика.

+0

спасибо alot Nice answer :) –

+0

Привет, я просто хочу поделиться немного другим подходом, который я нашел и ответил здесь: http://stackoverflow.com/a/43119987/1605873 –

0

Вы можете использовать ACR.UserDialogs в Xamarin.Forms, вы найдете очень легко, как:

UserDialogs.Instance.ShowLoading("Loading..."); 
UserDialogs.Instance.HideLoading(); 

посмотреть на образец в acr github

Смежные вопросы