C# GotFocus和GotKeyboardFocus之间的区别
C# GotFocus和GotKeyboardFocus之间的区别,c#,wpf,c#-4.0,wpf-controls,wpf-4.0,C#,Wpf,C# 4.0,Wpf Controls,Wpf 4.0,GotFocus和GotKeyboardFocus-以及类似的LostFocus和LostKeyboardFocus之间的区别是什么 很抱歉问了这么简单的问题,但是,我在谷歌上搜索了它,读了很多博客文章,但我还是很困惑。似乎没有人知道到底有什么区别): 更新: 我的用法: 我通过扩展控件类来创建自定义控件。类似于组合框,但有一些其他效果。我试图通过设置一个属性来打开和关闭一个弹出窗口,IsDropDownOpen,就像通过GotFocus和LostFocus事件打开和关闭一个组合框一样。我不想在
GotFocus
和GotKeyboardFocus
-以及类似的LostFocus
和LostKeyboardFocus
之间的区别是什么
很抱歉问了这么简单的问题,但是,我在谷歌上搜索了它,读了很多博客文章,但我还是很困惑。似乎没有人知道到底有什么区别):
更新:
我的用法:
我通过扩展控件
类来创建自定义控件。类似于组合框,但有一些其他效果。我试图通过设置一个属性来打开和关闭一个弹出窗口
,IsDropDownOpen
,就像通过GotFocus
和LostFocus
事件打开和关闭一个组合框一样。我不想在Alt+Tab
关闭窗口时弹出窗口
关闭,但当我点击按钮
或转到文本框
时关闭。我做到了:
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
工作正常。但是丢失了一个没有。如果我在LostKeyboardFocus
中执行Lost
操作,那么当我Alt+Tab
窗口或Window
变为非活动状态时,就会调用该方法,而我不想这样做。我怎样才能解决它 对焦点有一个概述,但我将尝试在这里进行解释
WPF有两个关于焦点的概念。有物理键盘焦点,也有逻辑焦点。只有一个元素可以具有键盘焦点(如果应用程序不是活动的应用程序,则没有元素具有键盘焦点)
多个项目可以具有逻辑焦点。事实上,您可以创建新的“焦点范围”。根据MSDN:
当键盘焦点离开焦点作用域时,焦点元素将失去键盘焦点,但将保留逻辑焦点。当键盘焦点返回到焦点范围时,焦点元素将获得键盘焦点。这允许在多个焦点作用域之间更改键盘焦点,但确保焦点作用域中的焦点元素在焦点返回到焦点作用域时重新获得键盘焦点
通过设置FocusManager.IsFocusScope=“True”
,可以在元素(通常是面板)上定义自己的焦点范围。默认情况下,WPF中作为焦点范围的控件有窗口
,菜单项
,工具栏
,以及上下文菜单
如果您考虑在应用程序中有多个窗口
s,这是有意义的。当您在它们之间切换Alt Tab
时,您希望您的键盘焦点回到上次窗口具有焦点时的位置。通过将键盘焦点和逻辑焦点分开,您可以实现这一点。+1谢谢,很好的解释。实际上比MSDNs好。谢谢。我等待了一段时间,如果没有更好的答案,我会接受你的答案。我正试图通过设置IsDropDownOpen
属性来打开一个Popup
(在继承自control
类的自定义控件中)。我在GotFocus
中将其设置为true
,它可以工作。我想在LostFocus
事件中将其设置为false
。但它不起作用。我不想在LostKeyboardFocus
中这样做,而是在LostFocus
中这样做。有什么想法吗?我想你需要用一些代码示例来创建一个新问题。我无法从简短的描述中调试您的场景。@king.net:您是否最终就您的特定问题提出了问题?我可能有一个相关的问题,我想阅读它和它的答案。