2009-06-09 6 views
14

Ich muss sowohl den einzelnen Klick und den Doppelklick einer Schaltfläche in einer WPF-Anwendung mit unterschiedlicher Reaktion behandeln. Leider löst WPF bei einem Doppelklick zwei Klickereignisse und ein Doppelklickereignis aus, so dass es schwierig ist, mit dieser Situation umzugehen.WPF: Taste Einzelklick + Doppelklick Problem

Es versuchte es mit einem Timer zu lösen, aber ohne Erfolg ... Ich hoffe, Sie können mir helfen.

Ermöglicht den Code sehen:

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 
} 

Das Problem ist, dass die 'SINGLE CLICK ACTION' genannt nach der 'DOPPELKLICKEN ACTION' auf Doppelklick. Es ist seltsam, dass ich die doubleClickTimer setzen auf Doppelklick auf null, sondern in der delayedBtnClick es ist wahr: O

ich schon versucht habe längere Zeit zu verwenden, eine Bool Flagge und Schloss ...

Haben Sie irgendwelche Ideen?

Am besten!

Antwort

16

Wenn Sie die RoutedEvent ‚s e.Handled zu true nach dem Umgang mit dem MouseDoubleClick Ereignisse gesetzt, dann wird es das zweite Mal nach den MouseDoubleClick das Click Ereignisse nicht nennen.

Es gibt eine recent post, die verschiedene Verhaltensweisen für SingleClick und DoubleClick berührt, die nützlich sein können.

Wenn Sie jedoch sicher sind, möchten Sie separate Verhalten und wollen/müssen die erste Click sowie der zweiten Click blockieren, können Sie die DispatcherTimer verwenden, wie Sie waren.

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

Vielen Dank! Das e.Handled = True war der Trick! Nochmals vielen Dank für die schnelle Reaktion :) – Hunsoul

+1

Wenn Sie diesen Konstruktor für DispatcherTimer verwenden, startet der Timer sofort, was zu einem einzelnen Einzelklick-Ereignis führt. Auch Background und Current sind Standardwerte, die die Dinge etwas verwirren (ich denke, da könnte Voodoo los sein!). Sehr nützlich, aber - Prost! –

+0

Ich sehe keine Verwendung von DoubleClickTime im Code. Stattdessen sehe ich eine hart codierte Verzögerung. Es ist normal? – SandRock

6

Sie konnten dieses versuchen:

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 
    } 
} 

Wenn nötig, können Sie per Mausklick und warten, bis die Maus benötigen, um die Aktion durchzuführen.

+0

Danke für Ihre Antwort! Ich habe es nicht ausprobiert, weil die erste Empfehlung mein Problem gelöst hat - aber danke nochmal! :) – Hunsoul

+2

Ich habe das versucht und es funktioniert super. Ich hoffe, dieser Kommentar wird für andere hilfreich sein. Danke, Josh. – akjoshi

+1

Das FIRST-Einzelklickereignis wird dadurch nicht beeinträchtigt, da für das erste Klickereignis e.ClickCount = 1 ist. – Knasterbax