Indicador de actividad de disparo en las formas de Xamarin

Tengo un icono en mi aplicación Xamarin.Forms, que cuando se hace clic, me gustaría cambiarlo a un indicador de actividad. Parece que debería usar un disparador , los activadores de eventos se ven bien, pero como mi imagen está declarada en XAML, no estoy seguro de cómo encajaría.

En este momento, tengo esto en XAML en la parte inferior de un stacklayout :

 

Cuando se hace clic, me gustaría mostrar esto, durante un tiempo determinado, y luego activar alguna funcionalidad de C #:

  

No estoy seguro de si sería mejor configurarlo todo en XAML con un activador, o si simplemente puedo tener un elemento de tipo de marcador de posición en XAML y luego tener todas las definiciones en C #.

Hay algunas maneras de hacer esto.

Simplemente puede dar a cada uno de ellos un x: Nombre y luego activar / desactivar IsRunning e IsVisible si desea ocultarlo.

Supongo que aunque tienes algún enlace de datos en marcha. Dado que IsRunning es un bool, simplemente puede vincularlo a un booleano en su código. Por ejemplo, en mi ViewModel tengo una propiedad de IsBusy e implemento INotifyPropertyChanged:

 public class MyViewModel : INotifyPropertyChanged { public MyViewModel() { } private bool busy = false; public bool IsBusy { get { return busy; } set { if (busy == value) return; busy = value; OnPropertyChanged("IsBusy"); } } public async Task GetMonkeysAsync() { if (IsBusy) return; try { IsBusy = true; //do stuff here that is going to take a while } finally { IsBusy = false; } } #region INotifyPropertyChanged implementation public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string name) { var changed = PropertyChanged; if (changed == null) return; changed(this, new PropertyChangedEventArgs(name)); } #endregion } 

Luego en el XAML puedes enlazar a IsBusy:

  

Creo que eso debería manejarlo. Si necesita un temporizador, puede usar el mismo enlace que tengo aquí y usar Xamarin.Forms integrado en la clase de temporizador.

La respuesta de James es correcta, sin embargo, prefiero usar la propiedad IsBusy la página por dos razones:

  1. Soy perezoso y no quiero configurar la implementación de INotifyPropertyChanged si no tengo que hacerlo.
  2. Se supone que XF usa esa propiedad para mostrar una notificación de forma predeterminada . Esto no parece estar funcionando, pero si alguna vez lo hace, este enfoque ya nos cubrirá para aprovecharla.

La única diferencia con la respuesta de James (además de eliminar la implementación de INPC) es que debe darle un nombre a la página ( x:Name="myPage" ) y luego declarar el enlace usando una referencia usando {Binding Source={x:Reference myPage}, Path=IsBusy} para los valores IsRunning e IsRunning .

es decir:

MainPage.xaml:

  ...  ...  

MainPage.xaml.cs:

 ... async void OnDoSomethingLong(...) { if (!this.IsBusy) { try { this.IsBusy = true; //await long operation here, ie: await Task.Run(() => {/*your long code*/}); } finally { this.IsBusy = false; } } } ...