WPF: Botón con un solo clic+problema de doble clic
timer mouseclick-event (2)
Tengo que manejar tanto el clic simple como el doble clic de un botón en una aplicación WPF con una reacción diferente. Desafortunadamente, en un doble clic, WPF dispara dos eventos de clic y un evento de doble clic, por lo que es difícil manejar esta situación.
Intentó resolverlo usando un temporizador pero sin éxito ... Espero que me puedas ayudar.
Veamos 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 la "ACCIÓN DE UN SOLO CLIC" se llama después de la "ACCIÓN DE HILO DOBLE" al hacer doble clic. Es extraño que configuro doubleClickTimer
para doubleClickTimer
al hacer doble clic, pero en el delayedBtnClick
es cierto: O
Ya he intentado usar más tiempo, una bandera bool y bloqueo ...
¿Tienes alguna idea?
¡Mejor!
Puedes 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
}
}
Si es necesario, puede requerir un clic del mouse y esperar hasta que el mouse suba para realizar la acción.
Si configura RoutedEvent
de e.Handled
en true
después de manejar el evento MouseDoubleClick
, no llamará al evento Click
la segunda vez después de MouseDoubleClick
.
Hay una publicación reciente que trata de tener diferentes comportamientos para SingleClick
y DoubleClick
que pueden ser útiles.
Sin embargo, si está seguro de que desea comportamientos separados y quiere / necesita bloquear el primer Click
así como el segundo Click
, puede usar el DispatcherTimer
como era antes.
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");
}