wpf timer mouseclick-event

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