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

В чем разница между GotFocus и GotKeyboardFocus а также LostFocus и LostKeyboardFocus ?

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

ОБНОВИТЬ:

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

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

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

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

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

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

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

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