Pregunta

Tengo que manejar tanto el simple clic y el doble clic de un botón en una aplicación WPF con distinta reacción. Por desgracia, en un doble clic, WPF dispara dos evento de clic y un evento de doble clic, así que es difícil de manejar esta situación.

Se trató de resolverlo mediante un temporizador, pero sin éxito ... espero que me puedan ayudar.

Permite ver el código:

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
}

El problema es que el 'solo clic ACCIÓN' después de la llamada 'DOBLE CLIC DE ACCIÓN' de DoubleClick. Es extraño que me puse a thedoubleClickTimer nulo en doble clic, pero en el delayedBtnClick es cierto: O

Ya he intentado usar el tiempo más largo, una bandera bool y cerradura ...

¿Tiene alguna idea?

Mejor!

¿Fue útil?

Solución

Si define RoutedEvent del e.Handled a true después de manipular el evento MouseDoubleClick entonces no va a llamar a la Click Evento segunda vez después de la MouseDoubleClick.

Hay una post reciente que toca el que tienen diferentes comportamientos para SingleClick y DoubleClick que puede ser útil.

Sin embargo, si está seguro de que desea comportamientos distintos y quiere / necesita para bloquear el primer Click, así como la segunda Click, puede utilizar la DispatcherTimer como si estuvieras.

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

Otros consejos

Usted podría intentar esto:

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

En caso de necesidad, se puede requerir clic del ratón y esperar hasta ratón hacia arriba para realizar la acción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top