【问题标题】:Know who got the focus in a Lost Focus event知道谁在失去焦点事件中获得焦点
【发布时间】:2010-05-24 18:36:03
【问题描述】:

是否有可能知道在失去焦点事件中谁获得了焦点?

Compact Framework 没有ActiveControl,所以我不知道如何判断谁获得了焦点。

【问题讨论】:

  • 您在下面的答案中已说明您希望使用 LostFocus 事件根据焦点所在的控件显示消息。为什么不直接使用相关控件的 GotFocus 事件呢?
  • @GenericTypeTea - 好点。除了显示一条消息之外,我还需要对留下的控件的值进行一些处理。可以在 GotFocus 中完成,但会有点尴尬。

标签: c# compact-framework focus


【解决方案1】:

这是最终奏效的解决方案:

public System.Windows.Forms.Control FindFocusedControl()
{
    return FindFocusedControl(this);
}

public static System.Windows.Forms.Control FindFocusedControl(System.Windows.Forms.Control container)
{
    foreach (System.Windows.Forms.Control childControl in container.Controls)
    {
        if (childControl.Focused)
        {
            return childControl;
        }
    }

    foreach (System.Windows.Forms.Control childControl in container.Controls)
    {
        System.Windows.Forms.Control maybeFocusedControl = FindFocusedControl(childControl);
        if (maybeFocusedControl != null)
        {
            return maybeFocusedControl;
        }
    }

    return null; // Couldn't find any, darn!
}

【讨论】:

    【解决方案2】:

    一种选择是互操作 GetFocus API

    [DllImport("coredll.dll, EntryPoint="GetFocus")]
    public extern static IntPtr GetFocus();
    

    这将为您提供当前具有输入焦点的窗口的句柄,然后您可以递归地迭代控件树以找到具有该句柄的控件。

    【讨论】:

    • 请记住,在 LostFocus 事件中调用 GetFocus 会导致控件失去焦点,因此虽然 GetFocus 会为您提供当前控件,但您必须有一些事件才能知道何时调用它。跨度>
    • @ctacke - 哇,听起来……很复杂。综上所述,如果我在错误的时间调用 GetFocus(比如在 LostFocus 事件中),它实际上会改变当前的焦点,而不仅仅是告诉我哪个控件有焦点?
    【解决方案3】:

    使用 corell.dll 看起来是个好主意。

    另一种可能的方法是为表单上的所有控件创建 GotFocus 事件处理程序,然后创建一个类级变量,该变量使用具有当前焦点的控件的名称进行更新。

    【讨论】:

    【解决方案4】:

    没有。首先是一个控件的 LostFocus 事件,然后是下一个控件的 GotFocus 事件。只要你不知道下一刻用户使用的是哪个控件,那是不可能的。
    而如果紧凑框架控件确实具有 TabIndex 属性,则只有在用户使用制表键时才能预测。

    编辑: 好的,您发布了解决方案,它运行良好我必须承认:简单的“否”是错误的 +1

    【讨论】:

    • 所以我很困惑......这个文档说 GotFocus 在 LostFocus 之前。 msdn.microsoft.com/en-us/library/… 但我看到 LostFocus 先走(如你所说)。
    • 该文件当然是正确的,但它缺少控制的实际含义的信息。因此请仔细阅读我所写的内容:一个控件的 LostFocus 位于 NEXT 控件的 GotFocus 之前。 MSDN 只是说 GotFocus 在 same 控件的 LostFocus 之前。您谈论“看到”,所以我假设您举了一个小例子,例如将不同控件的 Lost- 和 Gotfocus 事件的发生情况存储在 ListBox 中。
    • 啊...我现在明白了。嗯,这是有道理的,但我仍然没有更接近解决我的问题。
    • 也许描述一下你真正想用它做什么,也许还有其他更好的解决方案?
    • 在失去焦点的方法中,我想根据获得焦点的控件显示(或不显示)消息。
    【解决方案5】:

    这是 Vaccano 答案的较短代码,使用 Linq

    private static Control FindFocusedControl(Control container)
    {
        foreach (Control childControl in container.Controls.Cast<Control>().Where(childControl => childControl.Focused)) return childControl;
        return (from Control childControl in container.Controls select FindFocusedControl(childControl)).FirstOrDefault(maybeFocusedControl => maybeFocusedControl != null);
    }
    

    完全相同(在高级抽象中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      相关资源
      最近更新 更多