WPF: solo clic de botón + número doble clic
-
13-09-2019 - |
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!
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.