【问题标题】:The difference between GotFocus and GotKeyboardFocusGotFocus 和 GotKeyboardFocus 的区别
【发布时间】:2013-08-09 17:09:34
【问题描述】:

GotFocusGotKeyboardFocusLostFocusLostKeyboardFocus 之间有什么区别?

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

更新:

我的用法:

我正在通过扩展Control 类来创建自定义控件。 ComboBox 之类的东西,但还有其他一些效果。我试图通过设置属性来打开和关闭PopupIsDropDownOpen,就像通过GotFocusLostFocus 事件的ComboBox。我不想 Popup 关闭,当我 Alt+Tabed 窗口时,但是当我点击 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 没有。如果我在LostKeyboardFocus 中执行Lost 的操作,那么当我在Alt+Tab 窗口或Window 进入非活动状态时,就会调用该方法,而我并不想要。我该如何解决?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • +1 谢谢,很好的解释。实际上比 MSDN 更好。非常感谢。我等了一会儿,然后 - 如果没有收到更好的答案 - 接受你的。
    • 好吧,我正在尝试通过设置IsDropDownOpen 属性来打开Popup(在继承自Control 类的自定义控件中)。我在GotFocus 中将它设置为true,它可以工作。我想在LostFocus 事件中将其设置为false。但它不起作用。我不想在LostKeyboardFocus 中这样做,而是在LostFocus 中这样做。请问有什么办法吗?
    • 我认为您将需要使用一些代码示例创建一个新问题。我无法从那个简短的描述中调试你的场景。
    • @king.net:您最终是否针对您的特定问题提出了问题?我可能遇到了相关问题,我想阅读它及其答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多