2013-08-09 16 views
10

Jaka jest różnica (y) między GotFocus a GotKeyboardFocus - i podobnie LostFocus i LostKeyboardFocus?Różnica między GotFocus i GotKeyboardFocus

Przepraszam za proste pytanie, ale googlełem i czytałem wiele postów na blogu, ale wciąż jestem zdezorientowany. Wydaje się, nikt nie wie dokładnie, co jest różnica):

UPDATE:

Moja Wykorzystanie:

Tworzę kontrolę niestandardowe rozszerzenie Control klasę. Coś jak ComboBox, ale z kilkoma innymi efektami. Próbuję otworzyć i zamknąć Popup, ustawiając właściwość: IsDropDownOpen podobnie jak zdarzenia ComboBox przez GotFocus i LostFocus. Nie chcę, aby Popup się zamknęło, kiedy I Alt+Tab wydało okna, ale zamknęło się, gdy kliknę na przykład Button lub przejdę do TextBox. Zrobiłem:

private static void OnGotFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = true; 
    e.Handled = true; 
} 

private static void OnLostFocusHandler(object sender, RoutedEventArgs e) { 
    if (e.Handled) 
     return; 
    ((SearchBox)sender).IsDropDownOpen = false; 
    e.Handled = true; 
} 

W GotFocus prace. Ale nie udało się. Jeśli robię rzeczy Lost w LostKeyboardFocus, wtedy gdy I Alt+Tab okien lub Window przechodzi w stan nieaktywny, to metoda zostanie wywołana, a ja nie chcę. Jak mogę to rozwiązać?

Odpowiedz

12

MSDN ma przegląd ostrości, ale spróbuję to wyjaśnić tutaj.

WPF ma 2 koncepcje dotyczące ostrości. Istnieje fizyczne skupienie klawiatury i logiczne skupienie. Tylko jeden element może mieć fokus na klawiaturze (a jeśli aplikacja nie jest aktywną aplikacją, żaden element nie będzie miał fokusa klawiatury).

Wiele elementów może mieć logiczną ostrość. W rzeczywistości możesz tworzyć nowe "zakresy ostrości". Zgodnie z MSDN:

Gdy fokus klawiatury pozostawia zakres ostrości, skupiony element traci ostrość klawiatury, ale zachowuje logiczną ostrość. Gdy fokus na klawiaturze powraca do zakresu ostrości, element skupiony uzyskuje ostrość klawiatury. Pozwala to na zmianę ostrości klawiatury pomiędzy wieloma zakresami ostrości, ale zapewnia, że ​​skoncentrowany element w zakresie ogniskuje odzyskuje skupienie klawiatury, gdy ostrość powraca do zakresu ostrości.

Można zdefiniować własny zakres ostrości na element (zazwyczaj Panel) poprzez ustawienie FocusManager.IsFocusScope="True". Kontrolki w WPF, które są domyślnie zakresami ostrości, to: Window, MenuItem, ToolBar i ContextMenu.

Ma to sens, jeśli myślisz o tym, że masz wiele aplikacji Window. Gdy między nimi jest Alt-Tab, należy się skoncentrować na klawiaturze, aby powrócić do tego samego miejsca, w którym znajdował się po raz ostatni, gdy ostrość była ustawiona na Window. Poprzez utrzymywanie ostrości klawiatury i oddzielenie logicznego skupienia, możesz to osiągnąć.

+1

+1 dzięki, dobre wyjaśnienie. faktycznie lepsze niż MSDN ". Wielkie dzięki. Czekam na więcej odpowiedzi przez jakiś czas, a potem - jeśli nie ma lepszego - akceptuje twoje. –

+0

Otóż próbuję otworzyć 'Popup' (w kontrolce niestandardowej odziedziczonej po klasie' Control'), ustawiając właściwość 'IsDropDownOpen'.Ustawiłem ją na 'true' w' GotFocus', to działa. Chcę ustawić go na "false", w zdarzeniu "LostFocus". Ale to nie działa. Nie chcę tego robić w 'LostKeyboardFocus', ale w' LostFocus'. Masz pomysł? –

+0

Myślę, że będziesz potrzebować stworzyć nowe pytanie z przykładami kodu. Nie mogę debugować twojego scenariusza z tego krótkiego opisu. –