Frage

Ich habe zu behandeln sowohl den einzigen Klick und den Doppelklick auf eine Schaltfläche in einer WPF-Anwendung mit unterschiedlichen Reaktions. Leider auf einem Doppelklick, WPF feuert zwei Klick-Ereignis und ein Doppel-Klick-Ereignis, so ist es schwer, mit dieser Situation zu umgehen.

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

Hier können Sie den Code finden Sie unter:

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 nach der ‚DOPPELKLICKEN ACTION‘ genannt ‚SINGLE CLICK ACTION‘ auf Doppelklick. Es ist seltsam, dass ich thedoubleClickTimer auf null auf Doppelklick gesetzt, aber in der delayedBtnClick es ist wahr: O

Ich habe schon versucht, längere Zeit zu verwenden, einen Bool-Flag und Schloss ...

Haben Sie irgendwelche Ideen?

Best!

War es hilfreich?

Lösung

Wenn Sie die RoutedEvent des e.Handled auf true nach der MouseDoubleClick Event-Handling, dann wird es nicht das Click Ereignis zum zweiten Mal nach dem MouseDoubleClick nennen.

Es gibt eine kürzlich erschienenen Beitrag die auf berührt mit unterschiedlichen Verhaltensweisen für SingleClick und DoubleClick die nützlich sein können.

Wenn Sie jedoch sicher sind 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");
}

Andere Tipps

Sie könnten versuchen, diese:

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

Falls nötig, würden Sie per Mausklick erfordern und bis Maus warten bis die Aktion auszuführen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top