Vue d'ensemble du glisser-déplacer
Cette rubrique fournit une vue d'ensemble de la prise en charge du glisser-déplacer dans les applications Windows Presentation Foundation (WPF). Le glisser-déplacer fait généralement référence à une méthode de transfert de données qui implique l'utilisation d'une souris (ou d'un autre dispositif de pointage) pour sélectionner un ou plusieurs objets, les faire glisser vers une cible de déplacement souhaitée dans l'user interface (UI), et les y déplacer.
Cette rubrique comprend les sections suivantes.
- Prise en charge du glisser-déplacer dans WPF
- Transfert de données
- Événements glisser-déplacer
- Implémentation du glisser-déplacer
- Exemple de glisser-déplacer
- Rubriques connexes
Prise en charge du glisser-déplacer dans WPF
Les opérations de glisser-déplacer impliquent en général deux parties : une source de glissement d'où provient l'objet déplacé, et une cible de déplacement qui reçoit l'objet glissé. La source de glissement et la cible de déplacement peuvent être des éléments de l'interface utilisateur d'une même application ou d'applications différentes.
Le type et le nombre d'objets pouvant être manipulés par glisser-déplacer sont totalement aléatoires. Par exemple, les fichiers, dossiers et sélections de contenu font partie des objets les plus couramment manipulés par les opérations de glisser-déplacer.
Les actions particulières exécutées pendant une opération de glisser-déplacer sont spécifiques à une application, et souvent déterminées par le contexte. Par exemple, le glissement d'une sélection de fichiers d'un dossier vers un autre sur les mêmes périphériques de stockage déplace les fichiers par défaut, alors que le glissement des fichiers d'un partage Universal Naming Convention (UNC) vers un dossier local copie les fichiers par défaut.
Les fonctionnalités de glisser-déplacer fournies par WPF ont été conçues pour être très souples et personnalisables, afin de prendre en charge une large gamme de scénarios de glisser-déplacer. Le glisser-déplacer prend en charge la manipulation d'objets au sein d'une même application ou entre deux applications. Les opérations de glisser-déplacer depuis une application WPF vers une autre application Windows sont, elles aussi, entièrement prises en charge.
Dans WPF, tout UIElement ou ContentElement peut participer à l'opération de glisser-déplacer. Les événements et méthodes nécessaires aux opérations de glisser-déplacer sont définis dans la classe DragDrop. Les classes UIElement et ContentElement contiennent des alias pour les événements attachés DragDrop de façon à ce que les événements apparaissent dans la liste des membres de classe, lorsqu'un UIElement ou un ContentElement est hérité en tant qu'élément de base. Les gestionnaires d'événements attachés à ces événements sont attachés à l'événement attaché DragDrop sous-jacent, et reçoivent la même instance de données d'événement. Pour plus d'informations, consultez l'événement UIElement.Drop.
Note de sécurité |
---|
Le glisser-déplacer OLE ne fonctionne pas dans la zone Internet. |
Transfert de données
Le glisser-déplacer fait partie du domaine plus général du transfert de données. Le transfert de données comprend les opérations de glisser-déplacer et de copier-coller. L'opération de glisser-déplacer est similaire aux opérations de copier-coller et de couper-coller utilisées pour transférer des données d'un objet ou d'une application à l'autre, à l'aide du presse-papiers du système. Ces deux types d'opérations nécessitent :
un objet source qui fournit les données ;
un moyen de stockage temporaire des données transférées ;
un objet cible qui reçoit les données.
Dans une opération de copier-coller, le presse-papiers du système est utilisé pour stocker temporairement les données transférées ; dans une opération de glisser-déplacer, DataObject est utilisé pour stocker les données. Par concept, un objet de données se compose d'une ou plusieurs paires de Object contenant les données réelles et l'ID de format de données correspondant.
La source de glissement démarre l'opération de glisser-déplacer en appelant la méthode statique DragDrop.DoDragDrop et en lui passant les données transférées. La méthode DoDragDrop inclura automatiquement dans un wrapper les données d'un DataObject si nécessaire. Pour un plus grand contrôle du format des données, vous pouvez inclure les données d'un DataObject dans un wrapper avant de les passer à la méthode DoDragDrop. La cible de déplacement est chargée d'extraire les données du DataObject. Pour plus d'informations sur l'utilisation des objets de données, consultez Données et objets de données.
La source et la cible de l'opération de glisser-déplacer sont des éléments de l'interface utilisateur ; toutefois, l'élément qui est réellement transféré n'est en général pas visuellement représenté. Vous pouvez écrire du code pour fournir une représentation visuelle de l'élément glissé, tout comme lorsque vous faites glisser des fichiers dans l'Explorateur Windows. Par défaut, l'utilisateur est tenu au courant de l'effet de son action par la modification du curseur, par la représentation de l'effet que l'opération de glisser-déplacer aura sur les données si ces dernières sont déplacées ou copiées.
Effets de glisser-déplacer
Les opérations de glisser-déplacer peuvent avoir différents effets sur les données transférées. Par exemple, vous pouvez copier les données ou bien les déplacer. WPF définit une énumération DragDropEffects que vous pouvez utiliser pour spécifier l'effet d'une opération de glisser-déplacer. Dans la source de glissement, vous pouvez spécifier les effets que la source autorisera dans la méthode DoDragDrop. Dans la cible de déplacement, vous pouvez spécifier l'effet attendu de la cible dans la propriété Effects de la classe DragEventArgs. Lorsque la cible de déplacement spécifie son effet prévu dans l'événement DragOver, ces informations sont passées à la source de glissement dans l'événement GiveFeedback. La source de glissement utilise ces informations pour informer l'utilisateur de l'effet que la cible de déplacement doit avoir sur les données. Lorsque les données sont supprimées, la cible de déplacement spécifie son effet réel dans l'événement Drop. Ces informations sont passées à la source de glissement en tant que valeur de retour de la méthode DoDragDrop. Si la cible de déplacement retourne un effet qui n'est pas dans la liste des sources de glissement de allowedEffects, l'opération de glisser-déplacer est annulée, sans que le transfert de données ne soit effectué.
Il est important de se rappeler que dans WPF, les valeurs DragDropEffects sont uniquement utilisées pour permettre une communication entre la source de glissement et la cible de déplacement, au sujet des effets de l'opération de glisser-déplacer. L'effet réel de l'opération de glisser-déplacer dépend de la façon dont vous aurez écrit le code de votre application.
Par exemple, la cible de déplacement peut spécifier que l'effet de déplacer des données vers celle-ci correspond au déplacement des données. Toutefois, pour déplacer les données, elle doit à la fois être ajoutée à l'élément cible et supprimée de l'élément source. L'élément source peut indiquer qu'il permet le déplacement des données, mais si vous ne fournissez pas de code permettant de supprimer les données de l'élément source, cette action aura pour résultat la copie et non le déplacement des données.
Événements glisser-déplacer
Les opérations de glisser-déplacer prennent en charge un modèle piloté par un événement. La source de glissement et la cible de déplacement utilisent tous deux un ensemble standard d'événements pour gérer les opérations de glisser-déplacer. Les tables suivantes résument les événements glisser-déplacer standard. Il s'agit d'événements attachés à la classe DragDrop. Pour plus d'informations sur les événements attachés, consultez Vue d'ensemble des événements attachés.
Événements de source de glissement
Événement |
Résumé |
---|---|
[ E:System.Windows.DragDrop.GiveFeedback ] |
Cet événement se produit continuellement pendant une opération de glisser-déplacer, et permet à la source de déplacement de fournir une rétroaction visuelle à l'utilisateur. Cette rétroaction est généralement fournie par la modification de l'apparence du pointeur de la souris, indiquant les effets autorisés par la cible de déplacement. Il s'agit d'une propagation d'événements. |
[ E:System.Windows.DragDrop.QueryContinueDrag ] |
Cet événement se produit lorsqu'il y a une modification dans les états du clavier ou du bouton de la souris pendant une opération de glisser-déplacer, et permet à la source de déplacement d'annuler l'opération de glisser-déplacer selon les états de la touche/du bouton. Il s'agit d'un événement par propagation. |
[ E:System.Windows.DragDrop.PreviewGiveFeedback ] |
Version tunneling de GiveFeedback. |
[ E:System.Windows.DragDrop.PreviewQueryContinueDrag ] |
Version de tunneling de QueryContinueDrag. |
Événements de cible de déplacement
Événement |
Résumé |
---|---|
[ E:System.Windows.DragDrop.DragEnter ] |
Cet événement se produit lorsque vous faites glisser un objet dans les limites de la cible de déplacement. Il s'agit d'une propagation d'événements. |
[ E:System.Windows.DragDrop.DragLeave ] |
Cet événement se produit lorsque vous faites glisser un objet hors des limites de la cible de déplacement. Il s'agit d'un événement par propagation. |
[ E:System.Windows.DragDrop.DragOver ] |
Cet événement se produit continuellement pendant le glissement d'un objet au sein des limites de la cible de déplacement. Il s'agit d'un événement par propagation. |
[ E:System.Windows.DragDrop.Drop ] |
Cet événement se produit lorsqu'un objet est déplacé sur la cible de déplacement. Il s'agit d'un événement par propagation. |
[ E:System.Windows.DragDrop.PreviewDragEnter ] |
Version de tunneling de DragEnter. |
[ E:System.Windows.DragDrop.PreviewDragLeave ] |
Version de tunneling de DragLeave. |
[ E:System.Windows.DragDrop.PreviewDragOver ] |
Version de tunneling de DragOver. |
[ E:System.Windows.DragDrop.PreviewDrop ] |
Version de tunneling de Drop. |
Pour gérer des événements de glisser-déplacer pour les instances d'un objet, ajoutez des gestionnaires pour les événements répertoriés dans les tables précédentes. Pour gérer des événements de glisser-déplacer au niveau de la classe, substituez les méthodes virtuelles On*Event et On*PreviewEvent correspondantes. Pour plus d'informations, consultez Gestion de classe des événements routés par les classes de base de contrôle.
Implémentation du glisser-déplacer
Un élément d'interface utilisateur peut être une source de glissement, une cible de déplacement, ou les deux. Pour implémenter le glisser-déplacer de base, écrivez du code pour démarrer l'opération de glisser-déplacer et traiter les données déplacées. Vous pouvez améliorer le glisser-déplacer en gérant des événements facultatifs de glisser-déplacer.
Pour implémenter le glisser-déplacer de base, procédez aux tâches suivantes :
Identifiez l'élément destiné à être la source de glissement. Une source de glissement peut être un UIElement ou un ContentElement
Créez un gestionnaire d'événements pour la source de glissement qui sera chargé de démarrer l'opération de glisser-déplacer. L'événement est généralement un événement MouseMove.
Dans le gestionnaire d'événements de la source de glissement, appelez la méthode DoDragDrop pour démarrer l'opération de glisser-déplacer. Dans l'appel DoDragDrop, spécifiez la source de glissement, les données à transférer et les effets autorisés.
Identifiez l'élément destiné à être la cible de déplacement. Une cible de déplacement peut être un UIElement ou un ContentElement
Dans la cible de déplacement, attribuez la valeur true à la propriété AllowDrop.
Dans la cible de déplacement, créez un gestionnaire d'événements Drop pour traiter les données déplacées.
Dans le gestionnaire d'événements Drop, extrayez les données de DragEventArgs à l'aide des méthodes GetDataPresent et GetData.
Dans le gestionnaire d'événements Drop, utilisez les données pour effectuer l'opération de glisser-déplacer souhaitée.
Vous pouvez améliorer l'implémentation de votre glisser-déplacer en créant un DataObject personnalisé et en gérant des événements facultatifs de source de glissement et de cible de déplacement, comme le montrent les tâches suivantes :
Pour transférer des données personnalisées ou des éléments de données, créez un DataObject à passer à la méthode DoDragDrop.
Pour exécuter des actions supplémentaires pendant une opération de glissement, gérez les événements DragEnter, DragEnter et DragEnter dans la cible de déplacement.
Pour modifier l'apparence du pointeur de la souris, gérez l'événement GiveFeedback dans la source de glissement.
Pour modifier la façon dont l'opération de glisser-déplacer est annulée, gérez l'événement QueryContinueDrag dans la source de glissement.
Exemple de glisser-déplacer
Cette section décrit comment implémenter le glisser-déplacer pour un élément Ellipse. Ellipse est à la fois une source de glissement et une cible de déplacement. Les données transférées sont la représentation sous forme de chaîne de la propriété Fill de l'ellipse. Le code XAML suivant montre l'élément Ellipse et les événements de glisser-déplacer associés qu'il gère. Pour obtenir les procédures complètes d'implémentation du glisser-déplacer, consultez Procédure pas à pas : activation de la fonction glisser-déplacer sur un contrôle utilisateur.
Activation d'un élément en tant que source de glissement
L'objet destiné à être la source de glissement est chargé de :
l'identification du moment auquel se produit le glissement ;
l'initialisation de l'opération de glisser-déplacer ;
l'identification des données à transférer ;
la spécification des effets de l'opération de glisser-déplacer autorisés sur les données transférées.
La source de glissement peut également fournir une rétroaction visuelle au niveau des actions autorisées (déplacement, copie, aucune) et peut annuler l'opération de glisser-déplacer en fonction d'autres entrées utilisateur, comme par exemple, appuyer sur la touche Échap durant l'opération de glissement.
Il revient à votre application de déterminer lorsqu'une opération de glissement se produit, et de démarrer l'opération de glisser-déplacer en appelant la méthode DoDragDrop. Ce sera, en général, lorsqu'un événement MouseMove se produit sur l'élément à faire glisser pendant qu'un bouton de la souris est enfoncé. L'exemple suivant indique comment démarrer une opération de glisser-déplacer à partir du gestionnaire d'événements MouseMove d'un élément Ellipse pour faire de ce dernier la source de glissement. Les données transférées sont la représentation sous forme de chaîne de la propriété Fill de l'ellipse.
Dans le gestionnaire d'événements MouseMove, appelez la méthode DoDragDrop pour démarrer l'opération de glisser-déplacer. La méthode DoDragDrop accepte trois paramètres :
dragSource : référence à l'objet de dépendance correspondant à la source des données transférées ; il s'agit en général de la source de l'événement MouseMove.
data : objet contenant les données transférées, inclus dans un wrapper dans un DataObject
allowedEffects : l'une des valeurs de l'énumération DragDropEffects spécifiant les effets autorisés de l'opération de glisser-déplacer.
Tout objet sérialisable peut être passé dans le paramètre data. Si les données ne sont pas déjà incluses dans un wrapper dans un DataObject, elles seront automatiquement incluses dans un wrapper dans un nouveau DataObject. Pour passer plusieurs éléments de données, vous devez créer vous-même le DataObject et le passer à la méthode DoDragDrop. Pour plus d'informations, consultez Données et objets de données.
Le paramètre allowedEffects est utilisé pour spécifier ce que la source de glissement autorisera la cible de déplacement à faire des données transférées. Les valeurs communes pour une source de glissement sont Copy, Move et All.
Remarque |
---|
La cible de déplacement peut également spécifier les effets prévus en réponse aux données déplacées.Par exemple, si la cible de déplacement ne reconnaît pas le type de données à déplacer, elle peut refuser les données en attribuant à ses effets autorisés la valeur None.C'est généralement le cas de son gestionnaire d'événements DragOver . |
Une source de glissement peut également gérer les événements GiveFeedback et QueryContinueDrag. Ces événements possèdent des gestionnaires par défaut qui seront utilisés, à moins que vous ne marquiez les événements comme gérés. En général, vous pouvez ignorer ces événements, sauf si vous avez besoin de modifier leur comportement par défaut.
L'événement GiveFeedback est déclenché continuellement pendant l'opération de glissement de la source. Le gestionnaire par défaut de cet événement vérifie que la source de glissement se trouve sur une cible de déplacement valide. Si c'est le cas, il vérifie les effets autorisés de la cible de déplacement. Il fournit ensuite une rétroaction visuelle au sujet des effets de déplacement autorisés. Cette rétroaction visuelle se traduit généralement par la modification du curseur de la souris en un curseur ne permettant ni copie, ni déplacement. Cet événement doit uniquement être géré si vous avez besoin d'utiliser des curseurs personnalisés pour fournir une rétroaction visuelle. Si vous gérez cet événement, assurez-vous de le marquer comme étant géré afin que le gestionnaire par défaut ne remplace pas votre gestionnaire.
L'événement QueryContinueDrag est déclenché continuellement pendant l'opération de glissement de la source. Vous pouvez gérer cet événement pour déterminer quelle action doit terminer l'opération de glisser-déplacer, en fonction de l'état des touches Échap, Maj, Ctrl et Alt, ainsi que de l'état des boutons de la souris. Le gestionnaire par défaut de cet événement annule l'opération de glisser-déplacer si la touche Échap est enfoncée, et déplace les données si le bouton de la souris est relâché.
Attention |
---|
Ces événements sont déclenchés continuellement pendant l'opération de glisser-déplacer.Par conséquent, vous devez éviter les tâches nécessitant de nombreuses ressources dans les gestionnaires d'événements.Utilisez, par exemple, un curseur mis en cache au lieu de créer un nouveau curseur à chaque fois qu'un événement GiveFeedback est déclenché. |
Activation d'un élément en tant que cible de déplacement
L'objet destiné à être la cible de déplacement est chargé de :
spécifier qu'il s'agit d'une cible de déplacement valide ;
répondre à la source de glissement lorsqu'elle effectue le glissement vers la cible ;
vérifier que les données transférées sont dans un format qu'elle peut recevoir ,
traiter les données déplacées.
Pour spécifier un élément en tant que cible de déplacement, attribuez la valeur true à la propriété AllowDrop. Les événements de cible de déplacement seront ensuite déclenchés sur cet élément pour que vous puissiez les gérer. Pendant une opération de glisser-déplacer, la séquence d'événements suivante se produit sur la cible de déplacement :
L'événement DragEnter se produit lorsque les données sont glissées dans les limites de la cible de déplacement. En général, la gestion de cet événement vous permet d'obtenir un aperçu des effets de l'opération de glisser-déplacer, si cela est adapté à votre application. Ne définissez pas la propriété DragEventArgs.Effects dans l'événement DragEnter, car elle sera remplacée par l'événement DragOver.
L'exemple suivant montre le gestionnaire d'événements DragEnter d'un élément Ellipse. Ce code permet d'obtenir un aperçu des effets de l'opération de glisser-déplacer en enregistrant le pinceau Fill actuel. Il utilise ensuite la méthode GetDataPresent pour vérifier que le DataObject glissé sur l'ellipse contient bien des données de chaîne pouvant être converties en un Brush. Si tel est le cas, les données sont extraites à l'aide de la méthode GetData. Elles sont ensuite converties en un Brush, puis appliquées à l'ellipse. La modification peut être annulée depuis le gestionnaire d'événements DragLeave. Si les données ne peuvent pas être converties en un Brush, aucune action n'est effectuée.
L'événement DragOver se produit continuellement lorsque les données sont glissées vers la cible de déplacement. Cet événement est couplé avec l'événement GiveFeedback dans la source de glissement. Dans le gestionnaire d'événements DragOver, les méthodes GetDataPresent et GetData sont généralement utilisées pour vérifier que les données transférées sont dans un format que la cible de déplacement peut traiter. Vous pouvez également vérifier si des touches de modification sont enfoncées, ce qui indique en général que l'utilisateur a l'intention d'effectuer une copie ou un déplacement. Une fois ces vérifications effectuées, définissez la propriété DragEventArgs.Effects pour notifier la source de glissement de l'effet du déplacement des données. La source de glissement reçoit ces informations dans les arguments de l'événement GiveFeedback, et peut définir un curseur de façon à fournir une rétroaction visuelle.
L'exemple suivant montre le gestionnaire d'événements DragOver d'un élément Ellipse. Ce code vérifie que le DataObject glissé sur l'ellipse contient bien des données de chaîne pouvant être converties en un Brush. Si tel est le cas, il définit la propriété DragEventArgs.Effects Copy. Cela indique à la source de glissement que les données peuvent être copiées vers l'ellipse. Si les données ne peuvent pas être converties en un Brush, la propriété DragEventArgs.Effects est définie sur None. Cela indique à la source de glissement que l'ellipse n'est pas une cible de déplacement valide pour les données.
L'événement DragLeave se produit lorsque les données sont glissées en dehors des limites de la cible sans être déplacées. Cet événement permet d'annuler toutes vos actions dans le gestionnaire d'événements DragEnter.
L'exemple suivant montre le gestionnaire d'événements DragLeave d'un élément Ellipse. Ce code annule l'aperçu fourni par le gestionnaire d'événements DragEnter en appliquant le Brush enregistré à l'ellipse.
L'événement Drop se produit lorsque les données sont déplacées vers la cible de déplacement. Par défaut, cela se produit lorsque le bouton de la souris est relâché. Dans le gestionnaire d'événements Drop, utilisez la méthode GetData pour extraire les données transférées depuis le DataObject et exécuter tout traitement de données requis par votre application. L'événement Drop termine l'opération de glisser-déplacer.
L'exemple suivant montre le gestionnaire d'événements Drop d'un élément Ellipse. Ce code applique les effets de l'opération de glisser-déplacer, et est similaire à celui du gestionnaire d'événements DragEnter. Il vérifie que le DataObject glissé sur l'ellipse contient bien des données de chaîne pouvant être converties en un Brush. Si tel est le cas, Brush est appliqué à l'ellipse. Si les données ne peuvent pas être converties en un Brush, aucune action n'est effectuée.
Voir aussi
Référence
Autres ressources
Procédure pas à pas : activation de la fonction glisser-déplacer sur un contrôle utilisateur
Rubriques "Comment" relatives au glisser-déplacer
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Avril 2011 |
Mise à jour de la rubrique. |
Commentaires client. |