GotFocus
和GotKeyboardFocus
之间的区别是什么?LostFocus
和LostKeyboardFocus
之间有什么区别?
很抱歉这个简单的问题,但是,我用谷歌搜索并阅读了很多博客文章,但我仍然感到困惑。似乎没有人确切知道有什么区别):
更新
我的用法:
我正在通过扩展Control
类来创建自定义控件。类似于ComboBox
但有一些其他效果的东西。我试图通过设置属性Popup
来打开和关闭IsDropDownOpen
,ComboBox
就像GotFocus
和LostFocus
事件一样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}}变为非活动状态时,则会调用该方法,而我则不需要。我该如何解决?
答案 0 :(得分:15)
MSDN概述了焦点,但我会在这里解释一下。
WPF有两个关于焦点的概念。有物理键盘焦点,并有逻辑焦点。只有一个元素可以具有键盘焦点(如果应用程序不是活动应用程序,则没有元素将具有键盘焦点。)
多个项目可以具有逻辑焦点。实际上,您可以创建新的“焦点范围”。根据MSDN:
当键盘焦点离开焦点范围时,焦点元素将失去键盘焦点,但会保留逻辑焦点。当键盘焦点返回到焦点范围时,焦点元素将获得键盘焦点。这允许在多个聚焦范围之间改变键盘焦点,但确保当聚焦返回聚焦范围时聚焦范围中的聚焦元素重新获得键盘聚焦。
您可以通过设置Panel
在元素(通常为FocusManager.IsFocusScope="True"
)上定义自己的焦点范围。默认情况下,WPF中作为焦点范围的控件是Window
,MenuItem
,ToolBar
和ContextMenu
。
如果您考虑在应用程序中使用多个Window
,这是有道理的。当他们Alt-Tab
之间时,您希望键盘焦点返回到Window
最后一次焦点所在的位置。通过保持键盘焦点和逻辑焦点分离,您可以实现此目的。