如何更改焦点控制的背景颜色



我正在开发包含这么多控件的windows窗体。我想在Focus&一旦失去焦点,就会恢复到原来的颜色。我看到了这个链接,它提供了为表单上的每个控件编写代码的解决方案。是在Form&将其改回颜色。

在表单构造函数中,您可以将GotFocusLostFocus事件处理程序分配给表单的每个控件,如下所示:

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; 
    }
}

最新更新