Windows窗体:检测聚焦控件的更改

时间:2009-07-21 12:57:15

标签: c# .net winforms

我正在Windows窗体应用程序中实现复制粘贴。 当用户更改应用程序中的focus元素时,我需要为这两个操作启用/禁用条形按钮。

我可以使用类似这样的内容找到当前的聚焦控件:http://www.syncfusion.com/FAQ/windowsforms/faq_c41c.aspx#q1021q,但是如何检测聚焦控件是否已更改?

4 个答案:

答案 0 :(得分:9)

在表单加载事件处理程序中,您还可以遍历表单中包含的所有控件,并为每个可聚焦控件添加Enter事件的事件处理程序:

    private void Form1_Load(object sender, EventArgs e)
    {
        foreach (Control control in Controls)
        {
            control.Enter += ControlReceivedFocus;
        }
    }

    void ControlReceivedFocus(object sender, EventArgs e)
    {
        Debug.WriteLine(sender + " received focus.");
    }

答案 1 :(得分:2)

我的建议是使用Application.Idle事件。

  • 写入在Application.Idle事件中启用/禁用按钮的逻辑。
  • 在表单显示的事件
  • 上订阅Application.Idle事件
  • 点击按钮时检查按钮可用性(因此,您不会在重负载下通过意外点击)
  • 不要忘记在表单处理(或关闭)时删除空闲处理程序,因为这是静态事件

使用此技术,您将始终拥有正确的按钮状态,并且您无需担心订阅许多控件事件以检测焦点更改。这也是轻量级方法,因为只有在应用程序不忙时才会引发空闲事件。

答案 2 :(得分:1)

我认为您应该向控件添加一个事件处理程序(或者如果您有许多相同的类型,将其子类化,并覆盖相应的OnChange处理程序)。这样您就不必“找到”聚焦控件(它将作为发送者参数给出),并且只有在实际发生更改时才会出现事件。

答案 3 :(得分:0)

要检测控件上的焦点,您可以创建此事件:

void MyGotFocus(object sender, EventArgs e)
{
    if (sender is TextBox)
    {
        //TODO YOUR OPERATION
        //FOR EXAMPLE
        (sender as TextBox).SelectAll();
    }
}

,下一步是通过代码关联控件和事件:

myText1.GotFocus += MyGotFocus;
myText2.GotFocus += MyGotFocus;