2010-03-26 22 views
6

Durante lo sviluppo di un'applicazione WinForms, mi sono imbattuto in quello che ritengo sia un bug nei controlli OpenFileDialog e SaveFileDialog. Una ricerca su Google ha rilevato un'altra persona che ha notato lo stesso problema, ma non è stata fornita né una soluzione né una soluzione alternativa. È possibile visualizzare questo thread a: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.FileDialog DoubleClick Behavior

Ho un controllo personalizzato sul mio modulo che gestisce l'evento MouseDown. Se faccio doppio clic su un file in un controllo FileDialog mentre il mouse si trova su questo controllo (con la finestra di dialogo tra loro, ovviamente), viene attivato l'evento MouseDown. Non penso che questo sia un problema con il mio controllo, perché la persona che ho menzionato prima ha notato che questo sta accadendo con un controllo PictureBox. Sembrerebbe che anche se il pulsante del mouse fosse premuto (per il secondo clic per aprire il file) mentre si trovava nella finestra di dialogo, l'evento passava al modulo e al mio controllo quando la finestra di dialogo si chiudeva.

Ho provato a disattivare il mio controllo mentre la finestra di dialogo è attiva, ma ciò non ha impedito di catturare l'evento. Presumo che questo sia dovuto al fatto che l'evento viene passato dopo che la finestra di dialogo si è chiusa, quindi il mio controllo sarebbe stato riattivato. Qualcuno sa di un modo per impedire che il clic raggiunga il modulo e, a sua volta, il mio controllo? Inoltre, qualcuno può confermare se questo è veramente un bug nei controlli di FileDialog, o se ho solo qualche impostazione configurata in modo errato?

risposta

1

Stavo sperimentando gli eventi MouseDown e MouseMove quando ho capito perché il mio problema si stava verificando. Quando la casella FileDialog è scomparsa, l'evento MouseMove è stato attivato. In un tentativo (ovviamente stupido) di evitare di scrivere lo stesso blocco di codice due volte, stavo chiamando il mio gestore MouseDown dal gestore MouseMove, pensando che determinate condizioni (vale a dire che nessuno dei pulsanti del mouse fosse tenuto premuto) causassero effettivamente il gestore MouseDown Niente. Il problema era che il pulsante del mouse veniva tenuto premuto, perché la finestra FileDialog scompare su MouseDown (non su MouseClick). Ciò ha indotto il gestore MouseDown a eseguire il suo codice condizionale quando non me lo aspettavo.

Lezione per imparare da questo: attenzione dolorosa quando si incatenano i gestori di eventi. O meglio, inserire la funzionalità comune in un metodo e NON associare MAI i gestori di eventi. :-)

Grazie a Jelly Amma per avermi dato l'idea di guardare gli eventi reali più da vicino.

3

Ho già sentito parlare di questo problema e, per quanto ne so, si tratta di accertarsi di gestire correttamente la coda eventi. Senza vedere il tuo codice, è molto difficile controllare che l'implementazione del controllo utente sia corretta, ma piuttosto spesso, ignorare gli eventi del mouse senza che si verifichino eventi di base può portare a questo tipo di comportamento.

+0

Sto chiamando base.OnMouseDown (e) dall'interno del mio gestore OnMouseDown (MouseEventArgs e) sovrascritto. Ho provato a chiamarlo sia prima (all'inizio di) che dopo (in fondo) il mio gestore, ma nessuna delle due posizioni sembra avere alcun effetto sul problema. Dovrò controllare la coda degli eventi più da vicino e vedere se riesco a trovare qualcosa lì. –