Разница между GotFocus и GotKeyboardFocus
В чем разница(ы) между GotFocus
и GotKeyboardFocus
- и аналогично LostFocus
и LostKeyboardFocus
?
Обновление:
Мое использование:
Я создаю пользовательский элемент управления путем расширения класса Control
. Что-то вроде ComboBox
, но с некоторыми другими эффектами. Я пытаюсь открыть и закрыть a Popup
, установив a СВОЙСТВО: IsDropDownOpen
точно так же, как ComboBox
через события GotFocus
и LostFocus
. Я не хочу Popup
закрываться, когда я Alt+Tab
редактирую окна, но закрываюсь, когда я нажимаю на Button
, например, или я иду к TextBox
. Я сделал:
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;
}
GotFocus
работает. Если я делаю Lost
материал в LostKeyboardFocus
, то когда я Alt+Tab
окна, или Window
переходит в неактивное состояние, то метод вызывается, в то время как я не хочу. Как я могу решить эту проблему?
1 ответ:
MSDN имеет обзор фокуса, но я попытаюсь объяснить его здесь.
WPF имеет 2 концепции относительно фокуса. Есть физический фокус клавиатуры, и есть логический фокус. Только один элемент может иметь фокус клавиатуры (и если приложение не является активным приложением, ни один элемент не будет иметь фокус клавиатуры).
Несколько элементов могут иметь логический фокус. Фактически, вы можете создать новые "фокусные области". Согласно MSDN:
Когда фокус клавиатуры покидает фокус область, сфокусированный элемент потеряет фокус клавиатуры, но сохранит логический фокус. Когда фокус клавиатуры вернется в область фокусировки, сфокусированный элемент получит фокус клавиатуры. Это позволяет изменять фокус клавиатуры между несколькими областями фокусировки, но гарантирует, что сфокусированный элемент в области фокусировки восстановит фокус клавиатуры, когда фокус вернется в область фокусировки.
Вы можете определить свою собственную область фокусировки на элементе (обычно
Panel
), установивFocusManager.IsFocusScope="True"
. Управление в WPF, которые являются областями фокусировки по умолчанию являютсяWindow
,MenuItem
,ToolBar
, иContextMenu
.Это имеет смысл, если вы думаете о наличии нескольких
Window
s в вашем приложении. Когда выAlt-Tab
между ними, вы ожидаете, что ваш фокус клавиатуры вернется на то же место, где он был в последний раз, когдаWindow
был фокус. Удерживая фокус клавиатуры и логический фокус отдельно, вы можете достичь этого.