我正在开发包含这么多控件的windows窗体。我想在Focus&一旦失去焦点,就会恢复到原来的颜色。我看到了这个链接,它提供了为表单上的每个控件编写代码的解决方案。是在Form&将其改回颜色。
在表单构造函数中,您可以将GotFocus
和LostFocus
事件处理程序分配给表单的每个控件,如下所示:
foreach (Control ctrl in this.Controls)
{
ctrl.GotFocus += ctrl_GotFocus;
ctrl.LostFocus += ctrl_LostFocus;
}
然后在处理程序中,方法围绕聚焦控件的BackColor执行一些逻辑(例如,在GotFocus上,将当前BackColor保存到控件的标签,然后将BackColor设置为红色,在LostFocus上从控件的标签恢复原始BackColor):
void ctrl_LostFocus(object sender, EventArgs e)
{
var ctrl = sender as Control;
if (ctrl.Tag is Color)
ctrl.BackColor = (Color)ctrl.Tag;
}
void ctrl_GotFocus(object sender, EventArgs e)
{
var ctrl = sender as Control;
ctrl.Tag = ctrl.BackColor;
ctrl.BackColor = Color.Red;
}
我将编写一个扩展方法,并像这样使用:
this.textBox1.HookFocusChangeBackColor(Color.Blue);
扩展方式:
public static class ControlExtension
{
public static void HookFocusChangeBackColor(this Control ctrl, Color focusBackColor)
{
var originalColor = ctrl.BackColor;
var gotFocusHandler = new EventHandler((sender, e) =>
{
(ctrl as Control).BackColor = focusBackColor;
});
var lostFocusHandler = new EventHandler((sender, e) =>
{
(ctrl as Control).BackColor = originalColor;
});
ctrl.GotFocus -= gotFocusHandler;
ctrl.GotFocus += gotFocusHandler;
ctrl.LostFocus -= lostFocusHandler;
ctrl.LostFocus += lostFocusHandler;
}
}