GotFocus和GotKeyboardFocus之间的区别

age*_*t47 11 c# wpf wpf-controls wpf-4.0 c#-4.0

是什么区别(S)GotFocusGotKeyboardFocus-和同样LostFocusLostKeyboardFocus

对不起这个简单的问题,但是,我搜索了它并阅读了很多博客文章,但我仍然感到困惑.似乎没有人确切知道有什么区别):

更新:

我的用法:

我通过扩展Control类来创建自定义控件.有些东西,ComboBox但有一些其他的影响.我试图Popup通过设置属性来打开和关闭:IsDropDownOpen就像ComboBox通过GotFocusLostFocus事件一样.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;
}
Run Code Online (Sandbox Code Playgroud)

GotFocus作品.但那Lost个人没有.如果我做的Lost东西在LostKeyboardFocus那么当我Alt+Tab的窗户,或Window进入未激活,则该方法被调用,而我不想.我该如何解决?

Abe*_*cht 16

MSDN概述了焦点,但我会在这里解释一下.

WPF有两个关于焦点的概念.有物理键盘焦点,并有逻辑焦点.只有一个元素可以具有键盘焦点(如果应用程序不是活动应用程序,则没有元素将具有键盘焦点).

多个项目可以具有逻辑焦点.实际上,您可以创建新的"焦点范围".根据MSDN:

当键盘焦点离开焦点范围时,聚焦元素将失去键盘焦点,但将保持逻辑焦点.当键盘焦点返回到焦点范围时,焦点元素将获得键盘焦点.这允许在多个聚焦范围之间改变键盘焦点,但确保当聚焦返回聚焦范围时聚焦范围中的聚焦元素重新获得键盘聚焦.

您可以Panel通过设置在元素(通常是a )上定义自己的焦点范围FocusManager.IsFocusScope="True".这是由默认的焦点范围在WPF控件是Window,MenuItem,ToolBar,和ContextMenu.

如果您考虑Window在应用程序中使用多个s,这是有道理的.当你Alt-Tab在它们之间时,你希望你的键盘焦点返回到最后一次Window聚焦的同一个地方.通过保持键盘焦点和逻辑焦点分离,您可以实现此目的.