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

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

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

在表单加载事件处理程序中,您还可以遍历表单中包含的所有控件,并为每个可聚焦控件添加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."); } 

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

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

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

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

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

 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;