2009-06-09 9 views
14

Je dois gérer à la fois le simple clic et le double-clic d'un bouton dans une application WPF avec une réaction différente. Malheureusement, lors d'un double clic, WPF déclenche deux événements click et un double clic, il est donc difficile de gérer cette situation.WPF: Bouton simple clic + double clic problème

Il a essayé de le résoudre en utilisant une minuterie, mais sans succès ... J'espère que vous pouvez m'aider.

permet de voir le code:

private void delayedBtnClick(object statInfo) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate() 
    { 
     // ... DO THE SINGLE CLICK ACTION 
    })); 
} 

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    if (doubleClickTimer == null) 
     doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite); 
     } 
    } 
} 

private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    //.... DO THE DOUBLE CLICK ACTION 
} 

Le problème est que le 'ACTION SIMPLE CLIC' appelé après la 'ACTION DU DOUBLE CLIC' sur doubleClick. Il est étrange que je mis le doubleClickTimer à null double clic, mais dans le delayedBtnClick il est vrai: O

Je l'ai déjà essayé d'utiliser plus de temps, un drapeau bool et serrure ...

Avez-vous des des idées?

Meilleur!

Répondre

16

Si vous définissez l » e.Handled à trueRoutedEvent après avoir manipulé l'événement MouseDoubleClick alors il ne sera pas appeler l'événement Click la deuxième fois après la MouseDoubleClick.

Il ya un recent post qui touche à avoir des comportements différents pour SingleClick et DoubleClick qui peut être utile.

Toutefois, si vous êtes sûr que vous voulez comportements distincts et veulent/ont besoin de bloquer la première Click ainsi que la deuxième Click, vous pouvez utiliser la DispatcherTimer comme vous étiez.

private static DispatcherTimer myClickWaitTimer = 
    new DispatcherTimer(
     new TimeSpan(0, 0, 0, 1), 
     DispatcherPriority.Background, 
     mouseWaitTimer_Tick, 
     Dispatcher.CurrentDispatcher); 

private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    // Stop the timer from ticking. 
    myClickWaitTimer.Stop(); 

    Trace.WriteLine("Double Click"); 
    e.Handled = true; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    myClickWaitTimer.Start(); 
} 

private static void mouseWaitTimer_Tick(object sender, EventArgs e) 
{ 
    myClickWaitTimer.Stop(); 

    // Handle Single Click Actions 
    Trace.WriteLine("Single Click"); 
} 
+0

Merci beaucoup! Le e.Handled = true était l'astuce! Merci encore pour la réaction rapide :) – Hunsoul

+1

Si vous utilisez ce constructeur pour DispatcherTimer, le temporisateur démarre immédiatement, ce qui provoque un seul événement parasite. Aussi Background et Current sont des valeurs par défaut, donc confondez un peu les choses (il y a peut-être du vaudou!). Très utile cependant - applaudissements! –

+0

Je ne vois pas l'utilisation de DoubleClickTime dans le code. Au lieu de cela, je vois un délai codé en dur. Est-ce normal? – SandRock

6

Vous pouvez essayer ceci:

Button.MouseLeftButtonDown += Button_MouseLeftButtonDown; 

private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 

    if (e.ClickCount > 1) 
    { 
     // Do double-click code 
    } 

    else 
    { 
     // Do single-click code 
    } 
} 

Si nécessaire, vous pouvez avoir besoin clic de souris et d'attendre jusqu'à ce que la souris jusqu'à effectuer l'action.

+0

Merci pour votre réponse! Je ne l'ai pas essayé car la première recommandation a résolu mon problème - mais merci encore! :) – Hunsoul

+2

J'ai essayé ceci et cela fonctionne très bien. J'espère que ce commentaire sera utile pour les autres. Merci Josh. – akjoshi

+1

Cela n'entravera pas l'événement FIRST single click, car pour le premier événement click e.ClickCount = 1. – Knasterbax

Questions connexes