9 Stimmen

FileDialog Doppelklick-Verhalten

Bei der Entwicklung einer WinForms-Anwendung bin ich auf einen Fehler in den OpenFileDialog- und SaveFileDialog-Steuerelementen gestoßen, von dem ich glaube, dass er vorliegt. Eine Google-Suche ergab eine einzige andere Person, die das gleiche Problem bemerkt, aber weder eine Lösung noch eine Umgehung zur Verfügung gestellt wurde. Sie können diesen Thread ansehen unter: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event .

Ich habe ein benutzerdefiniertes Steuerelement auf meinem Formular, das das MouseDown-Ereignis behandelt. Wenn ich einen Doppelklick auf eine Datei in einem FileDialog-Steuerelement, während die Maus über dieses Steuerelement (mit dem Dialog zwischen ihnen, offensichtlich) ist, wird das MouseDown-Ereignis ausgelöst. Ich glaube nicht, dass dies ein Problem mit meinem Steuerelement ist, denn die Person, die ich zuvor erwähnte, bemerkte, dass dies mit einem PictureBox-Steuerelement passiert. Es scheint, dass, obwohl die Maustaste gedrückt wurde (für den zweiten Klick, um die Datei zu öffnen), während auf dem Dialogfeld, das Ereignis durch das Formular und mein Steuerelement übergeben, wenn der Dialog geschlossen.

Ich habe versucht, mein Steuerelement zu deaktivieren, während das Dialogfeld aktiv ist, aber das hat nicht verhindert, dass das Ereignis erfasst wird. Ich nehme an, dies ist, weil das Ereignis nach dem Schließen des Dialogs weitergegeben wird, so dass mein Steuerelement wieder aktiviert werden würde. Kennt jemand einen Weg, um zu verhindern, dass der Klick das Formular und damit mein Steuerelement erreicht? Kann mir jemand bestätigen, ob dies wirklich ein Fehler in den FileDialog-Steuerelementen ist, oder ob ich nur eine Einstellung falsch konfiguriert habe?

5voto

Jelly Amma Punkte 447

Ich habe schon einmal von diesem Problem gehört, und soweit ich weiß, ist es eine Frage der richtigen Handhabung der Ereigniswarteschlange. Ohne Ihren Code zu sehen, ist es sehr schwierig zu überprüfen, ob Ihre Implementierung des Benutzersteuerelements korrekt ist, aber ziemlich oft kann das Überschreiben der Mausereignisse, ohne dass die Basisereignisse ebenfalls auftreten, zu dieser Art von Verhalten führen.

3voto

Shaun Hamman Punkte 2137

Ich habe mit den MouseDown- und MouseMove-Ereignissen experimentiert, als ich erkannte, warum mein Problem auftrat. Wenn das FileDialog-Fenster verschwand, wurde das MouseMove-Ereignis ausgelöst. In einem (zugegebenermaßen dummen) Versuch, denselben Codeblock nicht zweimal zu schreiben, rief ich meinen MouseDown-Handler aus dem MouseMove-Handler heraus auf, weil ich dachte, dass bestimmte Bedingungen (nämlich dass keine der beiden Maustasten gedrückt gehalten wird) dazu führen würden, dass der MouseDown-Handler tatsächlich nichts tut. Das Problem war, dass die Maustaste gedrückt gehalten wurde, weil die FileDialog-Box auf MouseDown (nicht MouseClick) verschwindet. Dies führte dazu, dass der MouseDown-Handler seinen bedingten Code ausführte, als ich es nicht erwartete.

Die Lektion, die man daraus lernen kann, ist, dass man bei der Verkettung von Ereignishandlern sehr vorsichtig sein muss. Oder besser, ziehen Sie die gemeinsame Funktionalität in eine Methode und NIEMALS Kette Event-Handler. :-)

Danke an Jelly Amma, die mich auf die Idee gebracht hat, mir die tatsächlichen Ereignisse genauer anzusehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X