2008-10-20 21 views
8

Quiero reemplazar OnMouseClick y OnMouseDoubleClick y realizar diferentes acciones según el estilo de clic que se utilizó.¿Cómo puedo diferenciar entre clics simples y dobles en .Net?

El problema es que OnMouseClick está sucediendo para clics simples y dobles, y se llama antes de OnMouseDoubleClick.

Estoy seguro de que este debe ser un requisito común, así que supongo que me estoy perdiendo algo bastante obvio. ¿Alguien puede llenarme?

Editar para agregar: el recuento de MouseEventArgs.Clicks no ayuda. En el caso de un doble clic, el primer clic se maneja con un solo clic en OnMouseClick con MouseEventArgs.Clicks == 1.

Editar para agregar: los objetos son miniaturas de imágenes. Un solo clic debe activar y desactivar la selección para exportar. Haga doble clic para que la miniatura aparezca en pantalla completa. Las acciones de selección y "activación" son ortogonales. Esto puede indicar un problema subyacente con las dos acciones ...

Cheers, Rob

+0

¿Qué comportamiento están implementando entre una y dos clics? El estándar de Windows es de un solo clic = seleccionar, hacer doble clic = abrir, hacer que el solo clic seleccione "seguro" para manejar antes de abrir ... –

+0

Un solo clic activa y desactiva la selección (seleccione una miniatura para exportar). Doble clic activa (hace una miniatura en pantalla completa). Entonces la selección y activación son dos operaciones distintas. – Rob

+0

Pero debería seleccionar antes de activar, para que no invalide el manejo de forma independiente. Además, en el uso general, deseleccionar es hacer clic en otro lugar, ni un segundo clic. –

Respuesta

12

Eso ocurre a lo largo de Windows. No creo que hayan agregado nada especial para manejarlo en .Net.

Los medios habituales de manipulación esto es

  • a) acaba de hacer algo solo clic te gustaría que ocurrir antes de un doble clic , al igual que seleccione.
  • b) si eso no es una opción, en el evento click, inicie un temporizador. En el tic del temporizador, haga la acción de un solo clic. Si el evento de doble clic aparece primero, elimine el temporizador y haga doble clic.

La cantidad de tiempo que establece el tiempo debe ser igual al tiempo de doble clic del sistema (que el usuario puede especificar en el panel de control). Está disponible desde System.Windows.Forms.SystemInformation.DoubleClickTime. Los detalles completos se encuentran en MSDN, here

+0

Recuerda cuando configuras tu temporizador que las personas pueden, y con frecuencia lo hacen, hacer doble clic en su configuración: http://blogs.msdn.com/oldnewthing/archive/2008/10/02/8969396.aspx ... Asegúrate para acomodar eso, de lo contrario todavía podría obtener un solo clic antes de duplicar en ciertos casos extraños. –

+0

¿Un temporizador? Nooooooo! (OK, acepto que es práctico, pero no es bonito. ¿Es esta la única manera?) Cheers, Rob – Rob

+0

+ 1 a la opción a. La opción b se puede hacer, pero como dice John, pueden suceder cosas malas. En su escenario, es seguro usar primero clic = seleccionar, segundo clic = pantalla completa – mathieu

0

El problema es que la mayoría de los objetos no implementan ambos. Los pocos objetos que razonablemente pueden tener diferentes acciones para clics simples y dobles generalmente son correctos para ejecutar la acción de un solo clic antes de la acción de doble clic (resalte y abra una carpeta, ingrese el foco en una barra de direcciones antes de seleccionarla, etc.) El único La forma más fácil de determinar es esperar un solo clic por un período de tiempo y cancelar la acción para un solo clic si se detecta un doble clic.

-1

Puede iniciar un temporizador dentro del controlador de eventos OnMouseClick.

  • Si se agota el tiempo del temporizador (digamos 300ms), se intenta hacer un solo clic.

Else

  • Si otro evento OnMouseClick se generó antes de los tiempos de tiempo de espera se podría examinar la x & y posición del clic y si es dentro de un determinado radio alrededor de la primera posición a continuación, la acción la funcionalidad de doble clic.

De lo contrario

  • el mango por clic y reinicializar el temporizador para el segundo clic

NB: Esta aplicación tiene la ventaja del hecho de que tanto el timeoput y el 'doble -click 'radius se puede configurar independientemente de la configuración del sistema permitiendo que el s/w se importe en varias máquinas/

+0

¡Pero tiene la desventaja de ignorar las preferencias de tiempo de espera de doble clic de los usuarios! – Rob

+0

Esto es cierto, pero significa que puede crear un sistema coherente independiente del usuario. Supongo que todo se reduce a quién usa el sistema, un usuario o múltiples usuarios. –

0

Otra posible solución es hacer que la función OnMouseDoubleClick llame a OnMouseClick. Como la acción en OnMouseClick es un botón binario, al llamarlo dos veces se restablece al mismo estado.

De modo que cuando el usuario hace doble clic, Windows llama a OnMouseClick y luego a OnMouseDoubleClick. OnMouseDoubleClick llama a OnMouseClick (nuevamente) para restablecer el estado, y luego maneja el doble clic.

Esto se siente insatisfactorio como una solución, pero funciona.

Usar un temporizador (para tragar el primer clic del doble clic) es igualmente insatisfactorio, y tiene la complicación adicional de manejar las preferencias de frecuencia de doble clic del usuario.

Cheers, Rob

+0

No estoy seguro de que incluso funcione.Por ejemplo: el usuario hace clic en A, luego hace doble clic en B, que selecciona, deselecciona y expande B. Ahora, si seleccionó B, ¿deseleccionó A? Si es así, estás jodido. –

+0

Los objetos se manejan de forma independiente, por lo que A es independiente de B. En mi implementación, la posición del cursor pasada a través de MouseEventArgs se usa para identificar en qué imagen se hizo clic. – Rob

Cuestiones relacionadas