Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GotFocus和GotKeyboardFocus之间的区别_C#_Wpf_C# 4.0_Wpf Controls_Wpf 4.0 - Fatal编程技术网

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:您是否最终就您的特定问题提出了问题?我可能有一个相关的问题,我想阅读它和它的答案。