2010-03-26 10 views
6

Podczas tworzenia aplikacji WinForms natknąłem się na coś, co moim zdaniem jest błędem w formantach OpenFileDialog i SaveFileDialog. Wyszukiwarka Google zwróciła uwagę na jedną osobę, która zauważyła ten sam problem, ale nie podano rozwiązania ani obejścia. Możesz zobaczyć ten wątek pod adresem: http://bytes.com/topic/visual-basic-net/answers/389470-open-file-dialog-picturebox-click-event.FileDialog DoubleClick Behavior

Mam niestandardowy formant w moim formularzu, który obsługuje zdarzenie MouseDown. Jeśli dwukrotnie kliknę plik w formantu FileDialog, gdy mysz znajdzie się nad tym sterowaniem (oczywiście w oknie dialogowym między nimi), zostanie wywołane zdarzenie MouseDown. Nie sądzę, że to jest problem z moją kontrolą, ponieważ osoba, o której wspomniałem wcześniej, zauważyła, że ​​dzieje się to z kontrolą PictureBox. Wydawać by się mogło, że mimo naciśnięcia przycisku myszy (dla drugiego kliknięcia, aby otworzyć plik), podczas gdy w oknie dialogowym zdarzenie przechodziło do formularza i moje sterowanie, kiedy okno dialogowe się zamknęło.

Próbowałem wyłączyć kontrolę, gdy okno dialogowe jest aktywne, ale to nie powstrzymało go przed przechwyceniem zdarzenia. Zakładam, że dzieje się tak dlatego, że zdarzenie jest przekazywane po zamknięciu okna, więc moja kontrola zostanie ponownie włączona. Czy ktokolwiek wie, w jaki sposób zapobiec temu, aby kliknięcie dotarło do formularza, a co za tym idzie, kontrolować? Ponadto, czy ktoś może potwierdzić, czy rzeczywiście jest to błąd w kontrolkach FileDialog, czy też mam tylko niektóre ustawienia skonfigurowane niepoprawnie?

Odpowiedz

1

Eksperymentowałem ze zdarzeniami MouseDown i MouseMove, gdy uświadomiłem sobie, dlaczego wystąpił mój problem. Gdy pole FileDialog zniknęło, uruchomiono zdarzenie MouseMove. W (wprawdzie głupiej) próbie uniknięcia dwukrotnego napisania tego samego bloku kodu, dzwoniłem do mojego handlarza MouseDown z programu obsługi myszy MouseMove, myśląc, że pewne warunki (a nie trzymanie wciśniętego przycisku myszy) spowodowałyby, że program obsługi MouseDown skutecznie nic. Problem polegał na tym, że przycisk myszy był przytrzymywany, ponieważ pole FileDialog znika na MouseDown (nie MouseClick). Spowodowało to, że program obsługi MouseDown wykonał swój kod warunkowy, gdy się go nie spodziewałem.

Lekcja do nauczenia się z tego: bądź ostrożnie ostrożny podczas łączenia programów obsługi zdarzeń. Lub lepiej, przeciągnij wspólną funkcjonalność do metody i NIGDY nie łańcuch obsługi zdarzeń. :-)

Dzięki Jelly Amma za udzielenie mi pomysłu bliższego przyjrzenia się faktycznym zdarzeniom.

3

Słyszałem o tym problemie wcześniej i o ile wiem, chodziło o to, aby prawidłowo obsłużyć kolejkę zdarzeń. Nie widząc kodu, bardzo trudno jest sprawdzić, czy implementacja kontroli użytkownika jest poprawna, ale dość często, nadpisywanie zdarzeń myszy bez pozwolenia na występowanie zdarzeń podstawowych może prowadzić do tego rodzaju zachowania.

+0

Nazywam base.OnMouseDown (e) z mojego nadpisanego programu obsługi OnMouseDown (MouseEventArgs e). Próbowałem wywoływanie go zarówno przed (na górze) i po (na dole) mój program obsługi, ale żadna pozycja wydaje się mieć żadnego wpływu na problem. Będę musiał przyjrzeć się bliżej kolejce zdarzeń i sprawdzić, czy mogę coś tam znaleźć. –

Powiązane problemy