GotFocus和GotKeyboardFocus之间的区别

时间:2013-08-09 17:09:35

标签: c# wpf c#-4.0 wpf-controls wpf-4.0

GotFocusGotKeyboardFocus之间的区别是什么?LostFocusLostKeyboardFocus之间有什么区别?

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

更新

我的用法:

我正在通过扩展Control类来创建自定义控件。类似于ComboBox但有一些其他效果的东西。我试图通过设置属性Popup来打开和关闭IsDropDownOpenComboBox就像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; } 时关闭。我做了:

GotFocus

Lost有效。但是Lost没有。如果我在LostKeyboardFocus中执行Alt+Tab内容,那么当我Window窗口或{{1}}变为非活动状态时,则会调用该方法,而我则不需要。我该如何解决?

1 个答案:

答案 0 :(得分:15)

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

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

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

  

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

您可以通过设置Panel在元素(通常为FocusManager.IsFocusScope="True")上定义自己的焦点范围。默认情况下,WPF中作为焦点范围的控件是WindowMenuItemToolBarContextMenu

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