What is the difference(s) between GotFocus
and GotKeyboardFocus
-and similarly LostFocus
and LostKeyboardFocus
?
Sorry for the simple question, but, I googled it and read a lot of blog posts, but I'm still confused. It seems nobody knows exactly what is the difference ):
UPDATE:
My usage:
I am creating a custom control by extending Control
class. Something like ComboBox
but with some other effects. I'm trying to open and close a Popup
by setting a property: IsDropDownOpen
just like a ComboBox
through the GotFocus
and LostFocus
events. I don't want to Popup
get closed, when I Alt+Tab
ed the windows, but get closed when I click on a Button
for example or I go to a TextBox
. I did:
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;
}
The GotFocus
works. But the Lost
one didn't. If I do the Lost
stuff in LostKeyboardFocus
then when I Alt+Tab
the windows, or Window
goes to inactive, then the method get called, while I don't want. How can I solve it?
MSDN has an overview of focus, but I'll try to explain it here.
WPF has 2 concepts regarding focus. There is the physical keyboard focus, and there is logical focus. Only one element can have keyboard focus (and if the application isn't the active application, no element will have keyboard focus).
Multiple items can have logical focus. In fact, you can create new "focus scopes". As per MSDN:
You can define your own focus scope on an element (typically a
Panel
) by settingFocusManager.IsFocusScope="True"
. The controls in WPF that are focus scopes by default areWindow
,MenuItem
,ToolBar
, andContextMenu
.This makes sense if you think about having multiple
Window
s in your application. When youAlt-Tab
between them, you expect your keyboard focus to return to the same place it was the last time theWindow
had focus. By keeping keyboard focus and logical focus separate, you can achieve this.