Partager via


Reconnaître un mouvement de glisser-déplacer

Un module de reconnaissance de mouvement de glisser-déplacer .NET Multi-Platform App UI (.NET MAUI) permet à des éléments et à leurs packages de données associés de faire l’objet d’un glissement d’un emplacement à l’écran vers un autre emplacement en utilisant un mouvement continu. Le glisser-déplacer peut se produire au sein d’une même application, ou il peut commencer dans une application et se terminer dans une autre.

La source de glissement, qui est l’élément sur lequel le mouvement de glissement est initié, peut fournir des données à transférer en remplissant un objet de package de données. Quand la source de glissement est relâchée, le dépôt se produit. La cible de dépôt, qui est l’élément sous la source de glissement, traite alors le package de données.

Le processus d’activation du glisser-déplacer dans une application est le suivant :

  1. Activez le glissement sur un élément en ajoutant un objet DragGestureRecognizer à sa collection GestureRecognizers. Pour plus d’informations, consultez Activer le glissement.
  2. [facultatif] Créez un package de données. .NET MAUI remplit automatiquement le package de données pour les contrôles d’image et de texte, mais pour d’autres contenus, vous devez construire votre propre package de données. Pour plus d’informations, consultez Créer un package de données.
  3. Activez le dépôt sur un élément en ajoutant un objet DropGestureRecognizer à sa collection GestureRecognizers. Pour plus d’informations, consultez Activer le dépôt.
  4. [facultatif] Gérez l’événement DropGestureRecognizer.DragOver pour indiquer le type d’opération autorisé par la cible de dépôt. Pour plus d’informations, consultez Gérer l’événement DragOver.
  5. [facultatif] Traitez le package de données pour recevoir le contenu déposé. .NET MAUI va récupérer automatiquement les données d’image et de texte du package de données, mais pour d’autres contenus, vous devez traiter le package de données. Pour plus d’informations, consultez Traiter le package de données.

Activer le dépôt

Dans .NET MAUI, la reconnaissance des mouvements de glissement est fournie par la classe DragGestureRecognizer. Cette classe définit les propriétés suivantes :

Les propriétés s’appuient sur des objets BindableProperty, ce qui signifie qu’elles peuvent être les cibles de liaisons de données et mises en forme avec un style.

La classe DragGestureRecognizer définit également les événements DragStarting et DropCompleted qui se déclenchent si la propriété CanDrag est true. Quand un objet DragGestureRecognizer détecte un mouvement de glissement, il exécute la DragStartingCommand et appelle l’événement DragStarting. Ensuite, quand l’objet DragGestureRecognizer détecte la fin d’un mouvement de dépôt, il exécute la DropCompletedCommand et appelle l’événement DropCompleted.

L’objet DragStartingEventArgs qui accompagne l’événement DragStarting définit les propriétés suivantes :

  • Cancel, de type bool, indique si l’événement doit être annulé.
  • Data, de type DataPackage, indique le package de données qui accompagne la source de glissement. Il s’agit d’une propriété en lecture seule.
  • PlatformArgs, de type PlatformDragStartingEventArgs?, représente les arguments spécifiques à la plateforme qui sont associés à l’événement.

Sur Android, la classe PlatformDragStartingEventArgs définit les propriétés suivantes :

  • Sender, de type View, représente la vue native attachée à l’événement.
  • MotionEvent, de type MotionEvent, représente l’événement contenant les informations pour l’état du glisser-déplacer.

En outre, sur Android, la classe PlatformDragStartingEventArgs définit les méthodes suivantes :

  • SetDragShadowBuilder, qui définit le View.DragShadowBuilder à utiliser quand le glissement commence.
  • SetClipData, qui définit le ClipData à utiliser quand le glissement commence.
  • SetLocalData, qui définit les données locales à utiliser quand le glissement commence.
  • SetDragFlags, qui définit les DragFlags à utiliser quand le glissement commence.

Par exemple, utilisez la méthode SetClipData pour associer ClipData à l’élément qui fait l'objet d'un glissement :

void OnDragStarting(object sender, DragStartingEventArgs e)
{
#if ANDROID
    string content = "insert your content here";
    e.PlatformArgs.SetClipData(Android.Content.ClipData.NewPlainText("Drag data", content));
#endif
}

L’objet DropCompletedEventArgs qui accompagne l’événement DropCompleted définit une propriété PlatformArgs, de type PlatformDropCompletedEventArgs?, qui représente les arguments spécifiques à la plateforme qui sont associés à l’événement.

Sur Android, la classe PlatformDropCompletedEventArgs définit les propriétés suivantes :

  • Sender, de type View, représente la vue native attachée à l’événement.
  • DragEvent, de type DragEvent, représente l’événement envoyé à différents moments pendant une opération de glisser-déplacer.

L’exemple XAML suivant montre un DragGestureRecognizer attaché à une Image :

<Image Source="monkeyface.png">
    <Image.GestureRecognizers>
        <DragGestureRecognizer />
    </Image.GestureRecognizers>
</Image>

Dans cet exemple, un mouvement de glissement peut être initié sur l’Image.

Conseil

Un mouvement de glissement est initié avec un appui long suivi d’un glissement.

Créer un package de données

Quand un glissement est initié, .NET MAUI crée automatiquement pour vous un package de données pour les contrôles suivants :

Le tableau suivant montre les propriétés qui sont lues et les conversions qui sont tentées quand un glissement est initié sur un contrôle de texte :

Control Propriété Conversion
CheckBox IsChecked bool converti en string.
DatePicker Date DateTime converti en string.
Editor Text
Entry Text
Label Text
RadioButton IsChecked bool converti en string.
Switch IsToggled bool converti en string.
TimePicker Time TimeSpan converti en string.

Pour le contenu autre que du texte et des images, vous devez créer vous-même un package de données.

Les packages de données sont représentés par la classe DataPackage, qui définit les propriétés suivantes :

La classe DataPackagePropertySet représente un conteneur de propriétés stocké en tant que Dictionary<string,object>. Pour plus d’informations sur la classe DataPackageView, consultez Traiter le package de données.

Stocker des données d’image ou de texte

Les données d’image ou de texte peuvent être associées à une source de glissement en stockant les données dans la propriété DataPackage.Image ou DataPackage.Text. Vous pouvez ajouter les données dans le gestionnaire pour l’événement DragStarting.

L’exemple XAML suivant montre un DragGestureRecognizer qui inscrit un gestionnaire pour l’événement DragStarting :

<Path Stroke="Black"
      StrokeThickness="4">
    <Path.GestureRecognizers>
        <DragGestureRecognizer DragStarting="OnDragStarting" />
    </Path.GestureRecognizers>
    <Path.Data>
        <!-- PathGeometry goes here -->
    </Path.Data>
</Path>

Dans cet exemple, le DragGestureRecognizer est attaché à un objet Path. L’événement DragStarting est déclenché quand un mouvement de glissement est détecté sur le Path, qui exécute le gestionnaire d’événements OnDragStarting :

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    e.Data.Text = "My text data goes here";
}

L’objet DragStartingEventArgs qui accompagne l’événement DragStarting a une propriété Data, de type DataPackage. Dans cet exemple, la propriété Text de l’objet DataPackage est définie sur une string. Le DataPackage peut ensuite fait l’objet d’un accès au moment du dépôt pour récupérer la string.

Stocker des données dans le conteneur de propriétés

Vous pouvez associer les données, y compris les images et le texte, à une source de glissement en stockant les données dans la collection DataPackage.Properties. Vous pouvez ajouter les données dans le gestionnaire pour l’événement DragStarting.

L’exemple XAML suivant montre un DragGestureRecognizer qui inscrit un gestionnaire pour l’événement DragStarting :

<Rectangle Stroke="Red"
           Fill="DarkBlue"
           StrokeThickness="4"
           HeightRequest="200"
           WidthRequest="200">
    <Rectangle.GestureRecognizers>
        <DragGestureRecognizer DragStarting="OnDragStarting" />
    </Rectangle.GestureRecognizers>
</Rectangle>

Dans cet exemple, le DragGestureRecognizer est attaché à un objet Rectangle. L’événement DragStarting est déclenché quand un mouvement de glissement est détecté sur le Rectangle, qui exécute le gestionnaire d’événements OnDragStarting :

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    Shape shape = (sender as Element).Parent as Shape;
    e.Data.Properties.Add("Square", new Square(shape.Width, shape.Height));
}

L’objet DragStartingEventArgs qui accompagne l’événement DragStarting a une propriété Data, de type DataPackage. La collection Properties de l’objet DataPackage, qui est une collection Dictionary<string, object>, peut être modifiée pour stocker les données requises. Dans cet exemple, le dictionnaire Properties est modifié pour stocker un objet Square, qui représente la taille du Rectangle par rapport à une clé « Square ».

Activer le dépôt

Dans .NET MAUI, la reconnaissance des mouvements de dépôt est fournie par la classe DropGestureRecognizer. Cette classe définit les propriétés suivantes :

  • AllowDrop, de type bool, qui indique si l’élément auquel le module de reconnaissance de mouvement est attaché peut être une cible de dépôt. La valeur par défaut de cette propriété est true.
  • DragOverCommand, de type ICommand, qui est exécutée quand la source de glissement fait l’objet d’un glissement sur la cible de dépôt.
  • DragOverCommandParameter, de type object : paramètre passé à la commande DragOverCommand.
  • DragLeaveCommand, de type ICommand, qui est exécutée quand la source de glissement fait l’objet d’un glissement en dehors de la cible de dépôt.
  • DragLeaveCommandParameter, de type object : paramètre passé à la commande DragLeaveCommand.
  • DropCommand, de type ICommand, qui est exécutée quand la source de glissement est déposée sur la cible de dépôt.
  • DropCommandParameter, de type object : paramètre passé à la commande DropCommand.

Les propriétés s’appuient sur des objets BindableProperty, ce qui signifie qu’elles peuvent être les cibles de liaisons de données et mises en forme avec un style.

La classe DropGestureRecognizer définit également les événements DragOver, DragLeave et Drop, qui se déclenchent si la propriété AllowDrop est true. Quand un DropGestureRecognizer reconnaît une source de glissement sur la cible de dépôt, il exécute l’événement DragOverCommand et appelle l’événement DragOver. Ensuite, si la source de glissement fait l'objet d'un glissement en dehors de la cible de dépôt, le DropGestureRecognizer exécute l’événement DragLeaveCommand et appelle l’événement DragLeave. Enfin, quand le DropGestureRecognizer reconnaît un mouvement de dépôt sur la cible de dépôt, il exécute la DropCommand et appelle l’événement Drop.

La classe DragEventArgs, qui accompagne les événements DragOver et DragLeave, définit les propriétés suivantes :

  • Data, de type DataPackage, qui contient les données associées à la source de glissement. Cette propriété est en lecture seule.
  • AcceptedOperation, de type DataPackageOperation, qui spécifie les opérations autorisées par la cible de dépôt.
  • PlatformArgs, de type PlatformDragEventArgs?, représente les arguments spécifiques à la plateforme qui sont associés à l’événement.

Sur Android, la classe PlatformDragEventArgs définit les propriétés suivantes :

  • Sender, de type View, représente la vue native attachée à l’événement.
  • DragEvent, de type DragEvent, représente l’événement envoyé à différents moments pendant une opération de glisser-déplacer.

Pour plus d’informations sur l’énumération DataPackageOperation, consultez Gérer l’événement DragOver.

La classe DropEventArgs qui accompagne l’événement Drop définit les propriétés suivantes :

  • Data, de type DataPackageView, qui est une version en lecture seule du package de données.
  • Handled, de type bool, indique si le gestionnaire d’événements a géré l’événement ou si .NET MAUI doit continuer son propre traitement.
  • PlatformArgs, de type PlatformDropEventArgs?, représente les arguments spécifiques à la plateforme qui sont associés à l’événement.

Sur Android, la classe PlatformDropEventArgs définit les propriétés suivantes :

  • Sender, de type View, représente la vue native attachée à l’événement.
  • DragEvent, de type DragEvent, représente l’événement envoyé à différents moments pendant une opération de glisser-déplacer.

L’exemple XAML suivant montre un DropGestureRecognizer attaché à une Image :

<Image BackgroundColor="Silver"
       HeightRequest="300"
       WidthRequest="250">
    <Image.GestureRecognizers>
        <DropGestureRecognizer />
    </Image.GestureRecognizers>
</Image>

Dans cet exemple, quand une source de glissement est déposée sur la cible de dépôt Image, la source de glissement est copiée dans la cible de dépôt si la source de glissement est une ImageSource. .NET MAUI copie automatiquement les images et le texte qui font l'objet d'un glissement sur les cibles de dépôt compatibles.

Gérer l’événement DragOver

L’événement DropGestureRecognizer.DragOver peut éventuellement être géré pour indiquer les types d’opérations autorisés par la cible de dépôt. Vous pouvez indiquer les opérations autorisées en définissant la propriété AcceptedOperation, de type DataPackageOperation, sur l’objet DragEventArgs qui accompagne l’événement DragOver.

L’énumération DataPackageOperation définit les membres suivants :

  • None indique qu’aucune action ne sera effectuée.
  • Copy indique que le contenu de la source de glissement sera copié dans la cible de dépôt.

Important

Quand un objet DragEventArgs est créé, la propriété AcceptedOperation a par défaut la valeur DataPackageOperation.Copy.

L’exemple XAML suivant montre un DropGestureRecognizer qui inscrit un gestionnaire pour l’événement DragOver :

<Image BackgroundColor="Silver"
       HeightRequest="300"
       WidthRequest="250">
    <Image.GestureRecognizers>
        <DropGestureRecognizer DragOver="OnDragOver" />
    </Image.GestureRecognizers>
</Image>

Dans cet exemple, le DropGestureRecognizer est attaché à un objet Image. L’événement DragOver est déclenché quand une source de glissement fait l’objet d’un glissement sur la cible de dépôt mais n’a pas été déposée, ce qui exécute le gestionnaire d’événements OnDragOver :

void OnDragOver(object sender, DragEventArgs e)
{
    e.AcceptedOperation = DataPackageOperation.None;
}

Dans cet exemple, la propriété AcceptedOperation de l’objet DragEventArgs est définie sur DataPackageOperation.None. Cette valeur garantit qu’aucune action n’est effectuée quand une source de glissement est déposée sur la cible de dépôt.

Traiter le package de données

L’événement Drop est déclenché quand une source de glissement est relâchée sur une cible de dépôt. .NET MAUI tente automatiquement de récupérer des données auprès du package de données quand une source de glissement est déposée sur les contrôles suivants :

Le tableau suivant montre les propriétés qui sont définies et les conversions qui sont tentées quand une source de glissement texte est déposée sur un contrôle de texte :

Control Propriété Conversion
CheckBox IsChecked string est converti en bool.
DatePicker Date string est converti en DateTime.
Editor Text
Entry Text
Label Text
RadioButton IsChecked string est converti en bool.
Switch IsToggled string est converti en bool.
TimePicker Time string est converti en TimeSpan.

Pour du contenu autre que du texte et des images, vous devez traiter vous-même le package de données.

La classe DropEventArgs qui accompagne l’événement Drop définit une propriété Data, de type DataPackageView. Cette propriété représente une version en lecture seule du package de données.

Récupérer des données d’image ou de texte

Les données d’image ou de texte peuvent être récupérées auprès d’un package de données dans le gestionnaire de l’événement Drop en utilisant des méthodes définies dans la classe DataPackageView.

La classe DataPackageView inclut les méthodes GetImageAsync et GetTextAsync. La méthode GetImageAsync récupère une image auprès du package de données qui a été stockée dans la propriété DataPackage.Image et retourne Task<ImageSource>. De même, la méthode GetTextAsync récupère du texte auprès du package de données qui a été stocké dans la propriété DataPackage.Text et retourne Task<string>.

L’exemple suivant montre un gestionnaire d’événements Drop qui récupère du texte auprès du package de données pour un Path :

async void OnDrop(object sender, DropEventArgs e)
{
    string text = await e.Data.GetTextAsync();

    // Perform logic to take action based on the text value.
}

Dans cet exemple, les données de texte sont récupérées auprès du package de données en utilisant la méthode GetTextAsync. Une action basée sur la valeur de texte peut ensuite être effectuée.

Récupérer des données auprès du conteneur de propriétés

Les données peuvent être récupérées auprès d’un package de données dans le gestionnaire de l’événement Drop en accédant à la collection Properties du package de données.

La classe DataPackageView définit une propriété Properties de type DataPackagePropertySetView. La classe DataPackagePropertySetView représente un conteneur de propriétés en lecture seule stocké en tant que Dictionary<string, object>.

L’exemple suivant montre un gestionnaire d’événements Drop qui récupère des données auprès du conteneur de propriétés d’un package de données pour un Rectangle :

void OnDrop(object sender, DropEventArgs e)
{
    Square square = (Square)e.Data.Properties["Square"];

    // Perform logic to take action based on retrieved value.
}

Dans cet exemple, l’objet Square est récupéré auprès du conteneur de propriétés du package de données en spécifiant la clé de dictionnaire « Square ». Une action basée sur la valeur récupérée peut ensuite être effectuée.

Glisser-déplacer entre les applications

Sur iOS, Mac Catalyst et Windows, le glisser-déplacer peut démarrer dans une application avec l’opération de déplacement correspondante se terminant par une application .NET MAUI. L’application à partir de laquelle un élément est déplacé est l’application source et l’application .NET MAUI sur laquelle un élément est supprimé est l’application de destination .

Il n’est pas possible de faire glisser d’une application source vers une application de destination .NET MAUI sur Android.

Obtenir la position du mouvement

La position à laquelle un mouvement de glisser-déplacer s’est produit peut être obtenue en appelant la méthode GetPosition sur un objet DragEventArgs, DragStartingEventArgs, ou un objet DropEventArgs. La méthode GetPosition accepte un argument Element? et retourne une position sous la forme d’un objet Point? :

void OnDragStarting(object sender, DragStartingEventArgs e)
{
    // Position relative to screen
    Point? screenPosition = e.GetPosition(null);

    // Position relative to specified element
    Point? relativeToImagePosition = e.GetPosition(image);
}

L’argument Element? définit l’élément par rapport auquel la position doit être obtenue. Si une valeur null est fournie pour cet argument, la méthode GetPosition retourne un objet Point? qui définit la position du mouvement de glissement ou de dépôt relativement à l’écran.