13

GotFocusGotKeyboardFocus-andLostFocus之间有什么区别LostKeyboardFocus

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

更新:

我的用法:

Control我正在通过扩展类来创建自定义控件。类似的东西,ComboBox但有一些其他的影响。我试图Popup通过设置一个属性来打开和关闭 a:IsDropDownOpen就像ComboBox通过GotFocusLostFocus事件一样。Popup当我编辑窗口时,我不想关闭Alt+Tab,但是当我单击 aButton例如或转到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进入非活动状态,那么该方法会被调用,而我不想要。我该如何解决?LostKeyboardFocusAlt+TabWindow

4

1 回答 1

17

MSDN对焦点有一个概述,但我将在此处尝试对其进行解释。

WPF 有两个关于焦点的概念。有物理键盘焦点,也有逻辑焦点。只有一个元素可以拥有键盘焦点(如果应用程序不是活动应用程序,则任何元素都不会拥有键盘焦点)。

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

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

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

Window如果您考虑在应用程序中有多个 s,这是有道理的。当您Alt-Tab在它们之间时,您希望您的键盘焦点返回到上次Window获得焦点的位置。通过将键盘焦点和逻辑焦点分开,您可以实现这一点。

于 2013-08-09T17:35:57.657 回答