2009-04-29 12 views

Odpowiedz

19

Fokus to metoda niskiego poziomu przeznaczona głównie dla autorów kontroli niestandardowej. Zamiast tego programiści aplikacji powinni użyć metody Select lub ActiveControl dla formantów podrzędnych lub metody Activate dla formularzy.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx

+17

Nie sądzę, że to wystarczająco dobra odpowiedź. Przeczytałem to i rozumiem. Napisałem niestandardową kontrolę. Nie wiem, czy właściwe jest dla mnie użycie opcji Select vs Focus w moim sterowaniu niestandardowym. Czy to zawsze? Czy jest jakiś zestaw kryteriów? jakie są implikacje jednej z drugiej, zarówno rzeczywistej, jak i semantycznej? –

+5

Podejrzewam, że większość ludzi będzie czytać MSDN przed wpisaniem tego pytania w Google. Proste powtórzenie tego tutaj verbatum nie jest zbyt pomocne. –

31

ostrości() jest funkcją niskiego poziomu, że faktycznie ustawia ostrość.

Select() to metoda o wyższym poziomie. Najpierw wygląda on iteracyjnie w górę w hierarchii nadrzędnej kontrolki, dopóki nie znajdzie kontroli kontenera. Następnie ustawia właściwość ActiveControl kontenera (do kontrolki nazwanej). Logika tych metod nie jest jednak prosta i istnieje specjalna obsługa dla kontenerów UserControl.

1

Z osobistego doświadczenia napisałem kontrolkę użytkownika dziedziczącą zestaw Windows ComboBox. Musiałem napisać kod, aby zastąpić zdarzenie OnEnter i miałem oświadczenie nie mówiąc

If Me.Focused Then ... Else ... 

Jednak niestety zwrócił nieoczekiwany rezultat. Jeśli zadzwoniłem pod numer MyCustomerComboControl.Select (w obu wczytywanych, pokazanych lub aktywowanych zdarzeniach), nazwałem metodę OnEnter, ale nie udało mi się zarejestrować jej fokusa (tzn. Focused było Fałszywe), ale jeśli zadzwoniłem pod Focus, zadziałało. Ponadto zadziałało Select, jeśli formularz był otwarty, to znaczy, gdy wybrałem inną kontrolę, a następnie ponownie wybrano pierwotną kontrolę, wszystko było w porządku. Tak więc w innych okolicznościach, poza moim scenariuszem, użyj Select, ponieważ tak jest powyżej.

4

Dla przykładu, jak są one różne, jeśli próbujesz ustawić kontrolkę dla aplikacji Forms na skupienie domyślne, kiedy je otworzysz, tylko funkcja Select() będzie działała po wywołaniu w konstruktorze po InitializeComponent(). Focus() nie będzie.

+0

Widzę, co może być tego przyczyną? –

3

Aby dodać do tego wątku, znalazłem to podczas pisania kontroli użytkownika, która przeniosła inne formanty z jednej formy do drugiej (nowo utworzony formularz). Oryginalny formularz nie mógł już wybrać kontrolki, ale użycie fokusa pozwoliło na to. Myślę, że to podkreśla odpowiedzi na temat poziomów, na których działają te metody. Ale oznacza to również, że nie jest to wystarczająco proste, aby użyć opcji Wybierz na wyższym poziomie, ponieważ opcja wyboru nie działa już zgodnie z oczekiwaniami w oryginalnej postaci (nie należy jej umieszczać w innej formie - akceptuję to)

0

Focus(), w niektórych sytuacjach, może spowodować, że okno kontrolujące uzyska skupienie, jeśli nie ma fokusu. Wybierz() nie powoduje przechwycenia fokusu przez okno.