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;