two stacklayout c# xaml xamarin xamarin.forms

c# - stacklayout - xamarin margin



Formas de Xamarin Pase a la izquierda/Pase a la derecha gestos (6)

A partir de la solución de @Ranjith Kumar, se me ocurrió lo siguiente:

public delegate void SwipedEventHandler(ISwipeListener sender, SwipedEventArgs e); public class SwipedEventArgs : EventArgs { readonly double _x; public double X => _x; readonly double _y; public double Y => _y; readonly View _view; public View View => _view; public SwipedEventArgs(View view, double x, double y) { _view = view; _x = x; _y = y; } } public interface ISwipeListener { event SwipedEventHandler SwipedDown; event SwipedEventHandler SwipedLeft; event SwipedEventHandler SwipedNothing; event SwipedEventHandler SwipedRight; event SwipedEventHandler SwipedUp; double TotalX { get; } double TotalY { get; } } public class SwipeListener : PanGestureRecognizer, ISwipeListener { public event SwipedEventHandler SwipedDown; public event SwipedEventHandler SwipedLeft; public event SwipedEventHandler SwipedNothing; public event SwipedEventHandler SwipedRight; public event SwipedEventHandler SwipedUp; double _totalX = 0, _totalY = 0; public double TotalX => _totalX; public double TotalY => _totalY; readonly View _view; public SwipeListener(View view) : base() { _view = view; _view.GestureRecognizers.Add(this); PanUpdated += OnPanUpdated; } void OnPanUpdated(object sender, PanUpdatedEventArgs e) { switch (e.StatusType) { case GestureStatus.Running: try { _totalX = e.TotalX; _totalY = e.TotalY; } catch (Exception exception) { Debug.WriteLine(exception.Message); } break; case GestureStatus.Completed: if (_totalX < 0 && Math.Abs(_totalX) > Math.Abs(_totalY)) { OnSwipedLeft(_totalX, _totalY); } else if (_totalX > 0 && _totalX > Math.Abs(_totalY)) { OnSwipedRight(_totalX, _totalY); } else if (_totalY < 0 && Math.Abs(_totalY) > Math.Abs(_totalX)) { OnSwipedUp(_totalX, _totalY); } else if (_totalY > 0 && _totalY > Math.Abs(_totalX)) { OnSwipedDown(_totalX, _totalY); } else OnSwipedNothing(_totalX, _totalY); break; } } protected virtual void OnSwipedDown(double x, double y) => SwipedDown?.Invoke(this, new SwipedEventArgs(_view, x, y)); protected virtual void OnSwipedLeft(double x, double y) => SwipedLeft?.Invoke(this, new SwipedEventArgs(_view, x, y)); protected virtual void OnSwipedNothing(double x, double y) => SwipedNothing?.Invoke(this, new SwipedEventArgs(_view, x, y)); protected virtual void OnSwipedRight(double x, double y) => SwipedRight?.Invoke(this, new SwipedEventArgs(_view, x, y)); protected virtual void OnSwipedUp(double x, double y) => SwipedUp?.Invoke(this, new SwipedEventArgs(_view, x, y)); }

El inconveniente es que no se puede hacer nada mientras se realiza el barrido, solo después.

Quiero comenzar con esto diciendo que soy completamente nuevo en el desarrollo móvil, Xamarin, C #, .Net.

Estoy trabajando para crear una aplicación móvil con Xamarain Forms y me he encontrado con el problema de no tener disponible el gesto de deslizar, al menos de acuerdo con la documentación que he visto.

Encontré este sitio: http://arteksoftware.com/gesture-recognizers-with-xamarin-forms/

Esto describe cómo agregar algunos gestos adicionales para que IOS / Android sea accesible en el contexto del formulario. Antes de tratar de seguir esto, quería ver si alguien más ha implementado deslizar en una aplicación de Xamarin Forms y cómo lo hicieron.

Mis objetivos son que tiene que haber un diseño de pila horizontal. Este diseño contiene 7 botones, cada botón refleja un día en la semana actual. Al deslizar hacia la izquierda en el diseño de la pila, el texto del botón cambiará a la semana anterior. Al deslizar hacia la derecha, el texto del botón cambiará a la próxima semana.

Así que también estoy tratando de usar MVVM para esto y XAML. Entonces, ¿es posible que separe el barrido a la izquierda y el movimiento a la derecha? Quiero usar ICommand para pasar un determinado parámetro a una función basada en la dirección del barrido.

Cualquier ejemplo de este o cualquier consejo sería muy apreciado.


No necesita bibliotecas de terceros. No necesita pagar. Solo agregue estas dos clases e implemente sus escuchas de swipe

Paso 1: Copia pegar estas dos clases

SwipeListener.cs

using System; using Xamarin.Forms; namespace SwipeLib { public class SwipeListener : PanGestureRecognizer { private ISwipeCallBack mISwipeCallback; private double translatedX = 0, translatedY = 0; public SwipeListener(View view, ISwipeCallBack iSwipeCallBack) { mISwipeCallback = iSwipeCallBack; var panGesture = new PanGestureRecognizer(); panGesture.PanUpdated += OnPanUpdated; view.GestureRecognizers.Add(panGesture); } void OnPanUpdated(object sender, PanUpdatedEventArgs e) { View Content = (View)sender; switch (e.StatusType) { case GestureStatus.Running: try { translatedX = e.TotalX; translatedY = e.TotalY; } catch (Exception err) { System.Diagnostics.Debug.WriteLine("" + err.Message); } break; case GestureStatus.Completed: System.Diagnostics.Debug.WriteLine("translatedX : " + translatedX); System.Diagnostics.Debug.WriteLine("translatedY : " + translatedY); if (translatedX < 0 && Math.Abs(translatedX) > Math.Abs(translatedY)) { mISwipeCallback.onLeftSwipe(Content); } else if (translatedX > 0 && translatedX > Math.Abs(translatedY)) { mISwipeCallback.onRightSwipe(Content); } else if (translatedY < 0 && Math.Abs(translatedY) > Math.Abs(translatedX)) { mISwipeCallback.onTopSwipe(Content); } else if (translatedY > 0 && translatedY > Math.Abs(translatedX)) { mISwipeCallback.onBottomSwipe(Content); } else { mISwipeCallback.onNothingSwiped(Content); } break; } } } }

ISwipeCallBack.cs

using System; using Xamarin.Forms; namespace SwipeLib { public interface ISwipeCallBack { void onLeftSwipe(View view); void onRightSwipe(View view); void onTopSwipe(View view); void onBottomSwipe(View view); void onNothingSwiped(View view); } }

Paso 2: Desde sus formularios de Xamarin pase la vista y también la interfaz obj. Entonces obtienes resultado

En mi caso me pasa la etiqueta.

SwipeListener swipeListener = new SwipeListener(lbl_swipe, this);

Paso 3: Implementar la interfaz ISwipeCallBack

public partial class SwipeLibPage : ContentPage, ISwipeCallBack

Proyecto de muestra -> https://github.com/rranjithkumar100/Xamarin-Swipe-Library


Puede usar el paquete NuGet "XamarinFormsGesture" de Vapolia (documento disponible XamarinFormsGestures ). Es gratis y fácil de usar.

Disponible en iOS y Android, pero solo funciona en dispositivos físicos (no en simulador).


Si se siente cómodo pagando por una biblioteca de terceros (y está utilizando Xamarin Forms, por lo que es una buena posibilidad), MR.Gestures admite todos los gestos táctiles en todas las vistas de Xamarin.Forms. Lo he usado con éxito y estoy muy feliz con él. Cuesta unos 10 € muy razonables y tiene una excelente documentación.

Si eres una de las muchas personas que están decepcionadas de que los gestos táctiles no sean compatibles con Xamarin Forms, considera votar por esta sugerencia en UserVoice .


Siempre puedes echar un vistazo a this simple demostración. Y utilízalo como sigue:

GestureFrame gi = new GestureFrame { HorizontalOptions = LayoutOptions.FillAndExpand, VerticalOptions = LayoutOptions.FillAndExpand, BackgroundColor = Color.FromHex("bf3122"), }; gi.SwipeDown += (s, e) => { DisplayAlert("Gesture Info", "Swipe Down Detected", "OK"); ViewModel.SampleCommand.Execute("Swipe Down Detected"); }; gi.SwipeTop += (s, e) => { DisplayAlert("Gesture Info", "Swipe Top Detected", "OK"); ViewModel.SampleCommand.Execute("Swipe Top Detected"); }; gi.SwipeLeft += (s, e) => { DisplayAlert("Gesture Info", "Swipe Left Detected", "OK"); ViewModel.SampleCommand.Execute("Swipe Left Detected"); }; gi.SwipeRight += (s, e) => { DisplayAlert("Gesture Info", "Swipe Right Detected", "OK"); ViewModel.SampleCommand.Execute("Swipe Right Detected"); }; this.Content = gi;


Tal vez eso podría ayudar a alguien.

Tuve un problema: había una ContentPage con scrollview y grid. Todo lo que necesito hacer es manejar los movimientos de izquierda / derecha. Después de buscar en google / / github, encontré un paquete XamarinFormsGestures llamado XamarinFormsGestures . Eso me ayudó mucho. Toda la instrucción está dentro del enlace. Ahí está mi código:

Vapolia.Lib.Ui.Gesture.SetSwipeLeftCommand(scrollviewgrid, new Command(() => { OnLeftSwipe(); })); // What''s going on when left swiped. Vapolia.Lib.Ui.Gesture.SetSwipeRightCommand(scrollviewgrid, new Command(() => { OnRightSwipe(); })); // What''s going on when right swiped.