2010-03-26 19 views
6

Al desarrollar una aplicación WinForms, me encontré con lo que creo que es un error en los controles OpenFileDialog y SaveFileDialog. Una búsqueda en Google encontró a otra persona que notó el mismo problema, pero no se proporcionó una solución ni una solución. Puede ver este hilo en: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.FileDialog DoubleClick Behavior

Tengo un control personalizado en mi formulario que maneja el evento MouseDown. Si hago doble clic en un archivo en un control FileDialog mientras el mouse está sobre este control (con el diálogo entre ellos, obviamente), el evento MouseDown se activa. No creo que esto sea un problema para mi control, porque la persona que mencioné antes notó que esto sucedía con un control PictureBox. Parecería que, aunque se presionó el botón del mouse (durante el segundo clic para abrir el archivo) mientras estaba en el cuadro de diálogo, el evento pasó al formulario y a mi control cuando se cerró el cuadro de diálogo.

He intentado deshabilitar mi control mientras el cuadro de diálogo está activo, pero eso no impidió que se capturara el evento. Supongo que esto se debe a que el evento se transmite después de que se cierra el cuadro de diálogo, por lo que mi control se volvería a habilitar. ¿Alguien sabe de una forma de evitar que ese clic llegue al formulario y, a su vez, a mi control? Además, ¿alguien puede confirmar si esto realmente es un error en los controles FileDialog, o si solo tengo alguna configuración configurada incorrectamente?

Respuesta

1

Estaba experimentando con los eventos MouseDown y MouseMove cuando me di cuenta de por qué estaba ocurriendo mi problema. Cuando el recuadro FileDialog desapareció, se desencadenó el evento MouseMove. En un intento (francamente tonto) de evitar escribir el mismo bloque de código dos veces, llamaba a mi manejador MouseDown desde el controlador MouseMove, pensando que ciertas condiciones (es decir, que ninguno de los dos botones se mantuviera pulsado) provocarían que el manejador MouseDown nada. El problema era que el botón del mouse se mantenía presionado porque el cuadro de diálogo FileDialog desaparece en MouseDown (no en MouseClick). Esto hizo que el controlador MouseDown ejecutara su código condicional cuando no lo esperaba.

Lección para aprender de esto: tenga mucho cuidado al encadenar manejadores de eventos. O mejor, utilice la funcionalidad común en un método y NUNCA encadene los manejadores de eventos. :-)

Gracias a Jelly Amma por darme la idea de ver los eventos reales más de cerca.

3

He oído hablar de este problema antes y, por lo que yo sé, es una cuestión de asegurarse de que maneja la cola de eventos correctamente. Sin ver su código, es muy difícil verificar que su implementación de control de usuario sea correcta, pero con bastante frecuencia, anulando los eventos del mouse sin permitir que ocurran los eventos base, puede llevar a este tipo de comportamiento.

+0

Llamo a base.OnMouseDown (e) desde mi controlador OnMouseDown (MouseEventArgs e) anulado. Intenté llamarlo tanto antes (en la parte superior de) como después (en la parte inferior de) mi controlador, pero ninguna de las posiciones parece tener ningún efecto sobre el problema. Tendré que mirar más detenidamente la cola de eventos y ver si puedo encontrar algo allí. –

Cuestiones relacionadas