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

в чем разница(ы) между GotFocus и GotKeyboardFocus -аналогично LostFocus и LostKeyboardFocus?

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

обновление:

мои действия:

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

1 ответов


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

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

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

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

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

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