Разница между GotFocus и GotKeyboardFocus

В чем разница между GotFocus и GotKeyboardFocus и аналогично LostFocus и LostKeyboardFocus?

Извините за простой вопрос, но я просмотрел его и прочитал много сообщений в блогах, но я все еще смущен. Кажется, никто точно не знает, в чем разница):

UPDATE:

Мое использование:

Я создаю настраиваемый элемент управления, расширяя класс Control. Что-то вроде ComboBox, но с некоторыми другими эффектами. Я пытаюсь открыть и закрыть Popup, установив свойство: 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 никто этого не делал. Если я делаю Lost материал в LostKeyboardFocus, тогда, когда я Alt+Tab окна или Window переходит в неактивный, тогда метод вызывается, а я не хочу. Как я могу это решить?

Ответ 1

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

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

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

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

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

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