Ajouter un module de reconnaissance de mouvement de balayage
Un mouvement de balayage se produit lorsqu’un doigt est déplacé sur l’écran dans une direction horizontale ou verticale et est souvent utilisé pour lancer la navigation dans le contenu.
Pour qu’un View
reconnaisse un mouvement de balayage, créez une instance SwipeGestureRecognizer
, définissez la propriété Direction
sur une valeur d’énumération SwipeDirection
(Left
, Right
, Up
ou Down
), définissez éventuellement la propriété Threshold
, traitez l’événement Swiped
, et ajoutez le nouveau module de reconnaissance de geste sur la collection GestureRecognizers
sur la vue. L'exemple de code suivant montre un SwipeGestureRecognizer
attaché à un BoxView
:
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
</BoxView.GestureRecognizers>
</BoxView>
Voici le code C# équivalent :
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
boxView.GestureRecognizers.Add(leftSwipeGesture);
La classe SwipeGestureRecognizer
inclut également une propriété Threshold
, qui peut éventuellement être définie sur une valeur uint
qui représente la distance de balayage minimale devant être parcourue pour qu’un balayage soit reconnu, en unités indépendantes de l’appareil. La valeur par défaut de cette propriété est 100, ce qui signifie qu’un balayage inférieur à 100 unités indépendantes de l’appareil est ignoré.
Reconnaissance du sens du balayage
Dans les exemples ci-dessus, la propriété Direction
est définie sur une seule valeur de l’énumération SwipeDirection
. Toutefois, il est également possible de définir cette propriété sur plusieurs valeurs de l’énumération SwipeDirection
, pour que l’événement Swiped
soit déclenché en réponse à un balayage dans plusieurs directions. Toutefois, la contrainte est qu’un seul SwipeGestureRecognizer
peut seulement reconnaître les balayages qui se produisent sur le même axe. Par conséquent, les balayages qui se produisent sur l’axe horizontal peuvent être reconnus en définissant la propriété Direction
sur Left
et Right
:
<SwipeGestureRecognizer Direction="Left,Right" Swiped="OnSwiped"/>
De même, les balayages qui se produisent sur l’axe vertical peuvent être reconnus en définissant la propriété Direction
sur Up
et Down
:
var swipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up | SwipeDirection.Down };
Sinon, un SwipeGestureRecognizer
pour chaque direction de balayage peut être créé afin de reconnaître les balayages dans toutes les directions :
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Right" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Up" Swiped="OnSwiped"/>
<SwipeGestureRecognizer Direction="Down" Swiped="OnSwiped"/>
</BoxView.GestureRecognizers>
</BoxView>
Voici le code C# équivalent :
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left };
leftSwipeGesture.Swiped += OnSwiped;
var rightSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Right };
rightSwipeGesture.Swiped += OnSwiped;
var upSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Up };
upSwipeGesture.Swiped += OnSwiped;
var downSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Down };
downSwipeGesture.Swiped += OnSwiped;
boxView.GestureRecognizers.Add(leftSwipeGesture);
boxView.GestureRecognizers.Add(rightSwipeGesture);
boxView.GestureRecognizers.Add(upSwipeGesture);
boxView.GestureRecognizers.Add(downSwipeGesture);
Remarque
Dans les exemples ci-dessus, le même gestionnaire d’événements répond au déclenchement de l’événement Swiped
. Toutefois, chaque instance SwipeGestureRecognizer
peut utiliser un autre gestionnaire d’événements si nécessaire.
Réponse au balayage
Un gestionnaire d'événements pour l’événement Swiped
est illustré dans l’exemple suivant :
void OnSwiped(object sender, SwipedEventArgs e)
{
switch (e.Direction)
{
case SwipeDirection.Left:
// Handle the swipe
break;
case SwipeDirection.Right:
// Handle the swipe
break;
case SwipeDirection.Up:
// Handle the swipe
break;
case SwipeDirection.Down:
// Handle the swipe
break;
}
}
Les SwipedEventArgs
peuvent être examinés pour déterminer le sens du balayage, avec une logique personnalisée répondant au balayage en fonction des besoins. Vous pouvez obtenir le sens du balayage à partir de la propriété Direction
des arguments d’événement, définie sur une des valeurs de l’énumération SwipeDirection
. Par ailleurs, les arguments d’événement ont également une propriété Parameter
définie sur la valeur de la propriété CommandParameter
, le cas échéant.
Utilisation des commandes
La classe SwipeGestureRecognizer
inclut également les propriétés Command
et CommandParameter
. Ces propriétés sont généralement utilisées dans les applications qui utilisent le modèle modèle-vue-vue modèle (MVVM). La propriété Command
définit le ICommand
à appeler quand un mouvement de balayage est reconnu, avec la propriété CommandParameter
définissant un objet à passer à ICommand.
. L’exemple de code suivant montre comment lier la propriété Command
à un ICommand
défini dans le modèle de vue dont l’instance est définie comme page BindingContext
:
var boxView = new BoxView { Color = Color.Teal, ... };
var leftSwipeGesture = new SwipeGestureRecognizer { Direction = SwipeDirection.Left, CommandParameter = "Left" };
leftSwipeGesture.SetBinding(SwipeGestureRecognizer.CommandProperty, "SwipeCommand");
boxView.GestureRecognizers.Add(leftSwipeGesture);
Le code XAML équivalent est :
<BoxView Color="Teal" ...>
<BoxView.GestureRecognizers>
<SwipeGestureRecognizer Direction="Left" Command="{Binding SwipeCommand}" CommandParameter="Left" />
</BoxView.GestureRecognizers>
</BoxView>
SwipeCommand
est une propriété de type ICommand
définie dans l’instance de modèle de vue qui est définie comme page BindingContext
. Quand un mouvement de balayage est reconnu, la méthode Execute
de l’objet SwipeCommand
est exécutée. L’argument de la méthode Execute
est la valeur de la propriété CommandParameter
. Pour plus d’informations sur les commandes, consultez Interface de commande.
Création d’un conteneur de balayage
La classe SwipeContainer
, illustrée dans l’exemple de code suivant, est une classe de reconnaissance de balayage généralisée encapsulable autour d’un View
pour la reconnaissance de mouvement de balayage :
public class SwipeContainer : ContentView
{
public event EventHandler<SwipedEventArgs> Swipe;
public SwipeContainer()
{
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Left));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Right));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Up));
GestureRecognizers.Add(GetSwipeGestureRecognizer(SwipeDirection.Down));
}
SwipeGestureRecognizer GetSwipeGestureRecognizer(SwipeDirection direction)
{
var swipe = new SwipeGestureRecognizer { Direction = direction };
swipe.Swiped += (sender, e) => Swipe?.Invoke(this, e);
return swipe;
}
}
La classe SwipeContainer
crée des objets SwipeGestureRecognizer
pour les 4 directions de balayage et attache les gestionnaires d'événements Swipe
. Ces gestionnaires d’événements appellent l’événement Swipe
défini par le SwipeContainer
.
L’exemple de code XAML suivant montre la classe SwipeContainer
qui encapsule un BoxView
:
<ContentPage ...>
<StackLayout>
<local:SwipeContainer Swipe="OnSwiped" ...>
<BoxView Color="Teal" ... />
</local:SwipeContainer>
</StackLayout>
</ContentPage>
L’exemple de code suivant montre comment SwipeContainer
encapsule un BoxView
dans une page C# :
public class SwipeContainerPageCS : ContentPage
{
public SwipeContainerPageCS()
{
var boxView = new BoxView { Color = Color.Teal, ... };
var swipeContainer = new SwipeContainer { Content = boxView, ... };
swipeContainer.Swipe += (sender, e) =>
{
// Handle the swipe
};
Content = new StackLayout
{
Children = { swipeContainer }
};
}
}
Quand BoxView
reçoit un mouvement de balayage, l’événement Swiped
dans SwipeGestureRecognizer
est déclenché. Cet événement est traité par la classe SwipeContainer
qui déclenche son propre événement Swipe
. Cet événement Swipe
est traité dans la page. Les SwipedEventArgs
peuvent ensuite être examinés pour déterminer le sens du balayage, avec une logique personnalisée répondant au balayage en fonction des besoins.