Pregunta

Deseo anular OnMouseClick y OnMouseDoubleClick y realizar diferentes acciones según el estilo de clic que se haya utilizado.

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

Estoy seguro de que esto debe ser un requisito común, así que supongo que me falta algo bastante obvio. ¿Alguien me puede llenar?

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

Editar para agregar: los objetos son imágenes en miniatura. Un solo clic debería activar y desactivar la selección para la exportación. Hacer doble clic debería hacer que la miniatura esté en pantalla completa. La selección y "activación" Las acciones son ortogonales. Esto puede indicar un problema subyacente con las dos acciones ...

Saludos, Rob

¿Fue útil?

Solución

Eso sucede en todo Windows. No creo que hayan agregado nada especial para manejarlo en .Net.

El medio normal para manejar esto es

  • a) solo haz algo con un solo clic te gustaría pasar antes de un doble haga clic, como seleccionar.
  • b) si esa no es una opción, en el evento de clic, inicie un temporizador. En el tic del temporizador, realice la acción de un solo clic. Si el evento de doble clic ocurre primero, elimine el temporizador y realice la acción de doble clic.

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

Otros consejos

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 están bien para ejecutar la acción de un solo clic antes de la acción de doble clic (resalte y luego abra una carpeta, ingrese el foco en una barra de direcciones antes de seleccionarla, etc.) la forma de determinarlo probablemente sería esperar un solo clic durante un tiempo y cancelar la acción para el solo clic si se detecta un doble clic.

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

Entonces, cuando el usuario hace doble clic, Windows llama a OnMouseClick, luego a OnMouseDoubleClick. OnMouseDoubleClick llama a OnMouseClick (nuevamente) para restaurar el estado, luego maneja el doble clic.

Esto se siente como una solución insatisfactoria, 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 doble clic del usuario.

Saludos, Rob

Puede iniciar un temporizador dentro del controlador de eventos OnMouseClick.

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

Else

  • Si se generó otro evento OnMouseClick antes del tiempo de espera, podría examinar la posición x & amp; y del clic y si está dentro de un radio particular del primer clic, entonces active la funcionalidad de doble clic.

De lo contrario

  • Maneje el primer clic y reinicie el temporizador para el segundo clic

NB: esta implementación tiene la ventaja del hecho de que tanto el timeoput como el radio de "doble clic" se pueden configurar independientemente de la configuración del sistema, lo que permite importar s / w en varias máquinas /

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