Разница между 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 10

1 ответ:

MSDN имеет обзор фокуса, но я попытаюсь объяснить его здесь.

WPF имеет 2 концепции относительно фокуса. Есть физический фокус клавиатуры, и есть логический фокус. Только один элемент может иметь фокус клавиатуры (и если приложение не является активным приложением, ни один элемент не будет иметь фокус клавиатуры).

Несколько элементов могут иметь логический фокус. Фактически, вы можете создать новые "фокусные области". Согласно MSDN:

Когда фокус клавиатуры покидает фокус область, сфокусированный элемент потеряет фокус клавиатуры, но сохранит логический фокус. Когда фокус клавиатуры вернется в область фокусировки, сфокусированный элемент получит фокус клавиатуры. Это позволяет изменять фокус клавиатуры между несколькими областями фокусировки, но гарантирует, что сфокусированный элемент в области фокусировки восстановит фокус клавиатуры, когда фокус вернется в область фокусировки.

Вы можете определить свою собственную область фокусировки на элементе (обычно Panel), установив FocusManager.IsFocusScope="True". Управление в WPF, которые являются областями фокусировки по умолчанию являются Window, MenuItem, ToolBar, и ContextMenu.

Это имеет смысл, если вы думаете о наличии нескольких Window s в вашем приложении. Когда вы Alt-Tab между ними, вы ожидаете, что ваш фокус клавиатуры вернется на то же место, где он был в последний раз, когда Window был фокус. Удерживая фокус клавиатуры и логический фокус отдельно, вы можете достичь этого.