style evento botones c# events cross-platform xamarin.forms

c# - evento - Xamarin.Forms-Button Pressed & Released Event



xamarin forms button background image (2)

Quiero que mi evento se dispare cuando se presiona y suelta el botón, pero solo puedo encontrar el evento Click en Xamarin.Forms.

Creo que debe haber algo de trabajo para obtener esta funcionalidad. Mi necesidad básica es iniciar un proceso cuando se presiona el botón y detener cuando se libera . Parece ser una característica muy básica, pero Xamarin.Forms no lo tiene en este momento.

Intenté el botón TapGestureRecognizer en el botón, pero el botón se está disparando solo haga clic en evento.

MyButton.Clicked += (sender, args) => { Log.V(TAG, "CLICKED"); }; var tapGestureRecognizer = new TapGestureRecognizer(); tapGestureRecognizer.Tapped += (s, e) => { Log.V(TAG, "TAPPED"); }; MyButton.GestureRecognizers.Add(tapGestureRecognizer);

Tenga en cuenta que necesito que esos eventos funcionen en Android e iOS juntos.


Finalmente obtuve la solución sugerida por @Jason. Aquí vamos...

  1. Crear subclase de Xamarin.Forms.Button en el proyecto PCL, con capacidad de manejo de eventos

    public class CustomButton : Button { public event EventHandler Pressed; public event EventHandler Released; public virtual void OnPressed() { Pressed?.Invoke(this, EventArgs.Empty); } public virtual void OnReleased() { Released?.Invoke(this, EventArgs.Empty); } }

  2. Crear un procesador de botones específico de la plataforma en el proyecto respectivo

    Para Andorid

    [assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))] namespace WalkieTalkie.Droid.Renderer { public class CustomButtonRenderer : ButtonRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged(e); var customButton = e.NewElement as CustomButton; var thisButton = Control as Android.Widget.Button; thisButton.Touch += (object sender, TouchEventArgs args) => { if (args.Event.Action == MotionEventActions.Down) { customButton.OnPressed(); } else if (args.Event.Action == MotionEventActions.Up) { customButton.OnReleased(); } }; } } }

    Para IOS

    [assembly: ExportRenderer(typeof(CustomButton), typeof(CustomButtonRenderer))] namespace WalkieTalkie.iOS.Renderer { public class CustomButtonRenderer : ButtonRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) { base.OnElementChanged(e); var customButton = e.NewElement as CustomButton; var thisButton = Control as UIButton; thisButton.TouchDown += delegate { customButton.OnPressed(); }; thisButton.TouchUpInside += delegate { customButton.OnReleased(); }; } } }

  3. Crea una instancia de tu botón personalizado en tu página

    var myButton = new CustomButton { Text = "CustomButton", HorizontalOptions = LayoutOptions.FillAndExpand }; myButton.Pressed += (sender, args) => { System.Diagnostics.Debug.WriteLine("Pressed"); }; myButton.Released += (sender, args) => { System.Diagnostics.Debug.WriteLine("Pressed"); };

Espero que esto ayude a alguien :)


Button button = FindViewById (Resource.Id.myButton); button.Touch += (object sender, View.TouchEventArgs e) => { if (e.Event.Action == MotionEventActions.Up) { Toast.MakeText(this, "Key Up", ToastLength.Short).Show(); } if(e.Event.Action == MotionEventActions.Down) { Toast.MakeText(this, "Key Down", ToastLength.Short).Show(); } };