Question

Je souhaite remplacer OnMouseClick et OnMouseDoubleClick et effectuer différentes actions en fonction du style de clic utilisé.

Le problème est qu'OnMouseClick se produit à la fois pour les simples et doubles clics et qu'il est appelé avant OnMouseDoubleClick.

Je suis certain que cela doit être une exigence commune, alors je suppose que je manque quelque chose d'assez évident. Quelqu'un peut-il me renseigner?

Modifier pour ajouter: le nombre MouseEventArgs.Clicks n'aide pas. Dans le cas d'un double-clic, le premier clic est traité comme un simple clic dans OnMouseClick avec MouseEventArgs.Clicks == 1.

Modifier pour ajouter: les objets sont des vignettes d’image. Un simple clic devrait activer / désactiver la sélection pour l'exportation. Un double clic devrait rendre la vignette en plein écran. La sélection et "activation" les actions sont orthogonales. Cela peut indiquer un problème sous-jacent aux deux actions ...

Salut, Rob

Était-ce utile?

La solution

Cela se produit dans Windows. Je ne pense pas qu'ils aient ajouté quoi que ce soit de spécial pour le gérer en .Net.

Le moyen habituel de gérer cela est

  • a) faites un simple clic sur quelque chose vous voudriez arriver avant un double cliquez, comme sélectionner.
  • b) si ce n’est pas une option, démarrez un timer avec l’événement click. À la minuterie, faites l’action en un seul clic. Si l'événement de double-clic survient en premier, arrêtez le minuteur et effectuez l'action de double-clic.

La durée pour laquelle vous définissez la durée doit être égale à la durée du double-clic du système (que l'utilisateur peut spécifier dans le panneau de configuration). Il est disponible à partir de System.Windows.Forms.SystemInformation.DoubleClickTime. Les détails complets se trouvent dans le MSDN, ici

.

Autres conseils

Le problème est que la plupart des objets n'implémentent pas les deux. Les quelques objets pouvant raisonnablement avoir différentes actions pour les clics simples et doubles sont généralement acceptables pour exécuter l'action en un clic avant l'action en double-clic (surligner puis ouvrir un dossier, entrer le focus sur une barre d'adresse avant de le sélectionner, etc.). La meilleure façon de déterminer serait probablement d’attendre un certain temps et d’annuler l’action pour ce simple clic si un double-clic est détecté.

Une autre solution possible consiste à faire en sorte que la fonction OnMouseDoubleClick appelle OnMouseClick. Puisque l'action dans OnMouseClick est une bascule binaire, l'appeler deux fois réinitialisera le même état.

Ainsi, lorsque l'utilisateur double-clique, Windows appelle OnMouseClick, puis OnMouseDoubleClick. OnMouseDoubleClick appelle OnMouseClick (à nouveau) pour restaurer l'état, puis gère le double-clic.

Cela n’est pas une solution satisfaisante, mais cela fonctionne.

L'utilisation d'un minuteur (pour avaler le premier clic du double-clic) est également insatisfaisante et complique davantage la gestion des préférences de taux de double-clic de l'utilisateur.

Salut, Rob

Vous pouvez démarrer une minuterie dans le gestionnaire d'événements OnMouseClick.

  • Si la minuterie expire (par exemple 300 ms), un simple clic est prévu.

Sinon

  • Si un autre événement OnMouseClick a été généré avant la fin du délai imparti, vous pouvez examiner la position x et y du clic et si sa position se situe dans un rayon particulier du premier clic, puis d'activer la fonctionnalité de double-clic.

Sinon

  • Gérez le premier clic et réinitialisez le chronomètre pour le deuxième clic

NB: Cette implémentation a l’avantage de pouvoir configurer le rayon de temps double et le rayon de double-clic indépendamment de la configuration système, ce qui permet d’importer le logiciel sur plusieurs machines /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top