7
votes

WPF StackPanel avec click and doubleclick

Je dois être capable de gérer le double clic et et un seul clic 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.

Une idée de comment faire ça?

merci


1 commentaires

Je ne peux toujours pas comprendre comment Microsoft pourrait omettre une telle fonctionnalité de base.


7 Réponses :


4
votes

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 ( EDIT: strong> trouvé à l'origine ici ): xxx pré>

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);


4 commentaires

@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) est un problème si l'instance peut être consultée publiquement.



29
votes
 private void StackPanel_MouseDown(object sender, MouseButtonEventArgs e)
    {
        if (e.ClickCount >= 2)
        { 
            string hello; //only hit here on double click  
        }
    }

4 commentaires

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



4
votes

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.

Cela étant dit, ce n'est pas aussi simple vers l'avant et la fixation à l'événement fait un grand raccourci.

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.


0 commentaires

0
votes

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> xxx pré>

2) dans la méthode Window_Loaded Initialiser une variable déclarée précédemment avec un nombre plus grand que 200 p> xxx pré>

3) Ajouter un gestionnaire de bouton de la souris à votre panneau de pile p> xxx pré>

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
    }


0 commentaires

0
votes

Réponse complète à l'aide de WPF Disternmertimer . Nous créons la minuterie à la demande et la déconnectez-la lorsqu'il est terminé afin d'empêcher le colmatage des ressources.

le c #: xxx

le xaml: xxx


0 commentaires

12
votes

... 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. xxx


0 commentaires

0
votes

Il y a une solution plus facile à faire cela.

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


0 commentaires