Je dois être capable de gérer le double clic fort> et strong> et un seul clic fort> sur le WPF StackPanel. Mais il n'y a rien de tel que l'événement DoubleClick de StackPanel.
Je veux faire 2 opérations différentes dans ces 2 EventHandlers. P>
Une idée de comment faire ça? P>
merci p>
7 Réponses :
Le meilleur moyen est d'écrire votre propre gestionnaire de bouton de souris avec un délai d'attente - si l'événement est tiré à nouveau dans la période de délai d'attente, enfoncez votre message DoubleClick, sinon appelez le gestionnaire de clics unique. Voici quelques échantillons de code ( puis, dans la commande que vous souhaitez recevoir les événements: P> MouseClickManager fMouseManager = new MouseClickManager(200);
fMouseManager.Click += new MouseButtonEventHandler(YourControl_Click);
fMouseManager.DoubleClick += new MouseButtonEventHandler(YourControl_DoubleClick);
@MoomIntroll Haha, il arrive juste que je viens de la mettre en œuvre dans notre application: D
J'ai dû lire mal ... Vous commencez un nouveau fil à chaque fois que la souris est cliquée et ce n'est pas un double clic? Wow ... c'est ... hum ... Spécial. Veuillez considérer la solution ci-dessous en utilisant "E.ClickCount> = 2".
Je ne sais pas comment puis-je attribuer ces événements à contrôler?
En général, évitez de verrouiller sur un type public ou des instances au-delà de la commande de votre code. verrouillage (this) code> est un problème si l'instance peut être consultée publiquement.
private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount >= 2) { string hello; //only hit here on double click } }
Pas aussi performant que de manipuler un événement de double-clic, mais assez rapide quand ce n'est pas là. +1
Oui j'ai essayé ça .. mais j'ai besoin de gérer à la fois célibataire et doubleclick .. ClickCount n'en aidez pas vraiment, car il semble que DoubleClick == singleclick aussi.
@ PAN1C_SHOWT1ME Que diriez-vous de faire 'si (e.clickcount> = 2) {hantledoubelclick (); } else si (E.ClickCount> = 1) {poignéesLeclick ();} '
Eh bien, c'est la même chose que Troll apporté .. Le problème était que cliquez sur Compter n'était jamais> = 2
Une autre option consiste à ajouter un embarcation de la souris à l'entréeBindings sur le pilePelement, puis ajoutez une commande commutée qui est activée par la souris. Dans l'ensemble, il s'agit d'une meilleure pratique que de mécanismes d'événement, car il évite les problèmes de fuite de mémoire causés par de fortes références. Il prévoit également la séparation de la logique de commande de la représentation. P>
Cela étant dit, ce n'est pas aussi simple vers l'avant et la fixation à l'événement fait un grand raccourci. p>
Et il va sans dire, rendez votre arrière-plan de StackPanel au moins transparent ou ne sera pas pris par le clic de souris sur Test lorsque vous cliquez sur le "fond". Les arrière-plans nuls sont ignorés par la détection de frappe. p>
J'ai eu un problème similaire (répondez à un seul événement de clic et effectuez un travail supplémentaire en cas de double clic). J'ai résolu le problème de cette façon:
1) Définissez et déclarez un entier de contenir le dernier clic horaire p> 2) dans la méthode Window_Loaded Initialiser une variable déclarée précédemment avec un nombre plus grand que 200 p> 3) Ajouter un gestionnaire de bouton de la souris à votre panneau de pile p> 4) Ajouter la méthode suivante p > void stackPanel_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (e.Timestamp - lastClickTimeStamp < 200)
{
//double click
}
lastClickTimeStamp = e.Timestamp;
//single click
}
Réponse complète à l'aide de WPF le c #: p> le xaml: p> Disternmertimer code>. Nous créons la minuterie à la demande et la déconnectez-la lorsqu'il est terminé afin d'empêcher le colmatage des ressources.
... années plus tard. @ La solution de MoomIntroll est parfaitement acceptable. Une autre option consiste à envelopper le panneau de pile dans une commande de contenu qui prend en charge l'événement de double clic.
Il y a une solution plus facile à faire cela. P>
Dans l'évaluation des événements de StackPanel (par exemple), vous pouvez vérifier si la propriété MouseButToneventaRgs.ClickCount a une valeur de 2. 1 = simple clic 2 = double-cliquez sur p>
Je ne peux toujours pas comprendre comment Microsoft pourrait omettre une telle fonctionnalité de base.