自动更改活动控件的属性

时间:2012-03-03 17:33:49

标签: c# winforms user-controls

请认为我是c#的新手。在扫描了大约700个帖子后,我决定再发一个问题:

在我的Windows窗体(c#)上,我有一些控件,包括文本框,复选框等。 我想在控件变为活动状态时更改背景颜色。 我知道我可以为每个控件引发'enter'和'leave'事件来改变相应的属性,但应该有另一种方式。

3 个答案:

答案 0 :(得分:2)

只需勾选Enter和Leave事件 - 切换每个事件中的颜色。保存OnEnter中保存的最后一种颜色,以便在OnLeave

中使用
public Form1()
{
    InitializeComponent();

    var lastColorSaved = Color.Empty;

    foreach(Control child in this.Controls)
    {
        child.Enter += (s, e) =>
                            {
                                var control = (Control)s;
                                lastColorSaved = control.BackColor;
                                control.BackColor = Color.Red;
                            };
        child.Leave += (s, e) =>
                            {
                                ((Control)s).BackColor = lastColorSaved;
                            };
    }
}

答案 1 :(得分:1)

创建一个类(例如ControlColorizer)并在其构造函数中传递:

1)“主动控制”的背景颜色并保存到内部颜色变量
2)可变长度的控制数组

在构造函数中,为每个控件上的OnEnter和OnLeave添加相同的事件处理程序 在OnEnter事件中设置背景颜色 在OnLeave事件中设置标准背景颜色

优点在于使用该类:

1)在表单类中声明一个全局实例 2)在InitializeComponent之后以形式构造函数初始化 3)忘记其他一切。无需其他代码

让我用代码解释一切:

这将进入名为ControlColorizer.cs

的文件中
public class ControlColorizer
{
    private Color _setBColor = SystemColors.Window;

    public ControlColor(Color bkg, params Control[] ctls)
    {
        _setBColor = bkg;
        foreach (Control o in ctls)
        {
            o.Enter += new EventHandler(o_Enter);
            o.Leave += new EventHandler(o_Leave);
        }
    }

    private void o_Enter(object sender, EventArgs e)
    {
        if (sender is Control)
        {
            Control c = (Control)sender;
            c.BackColor = _setBColor;
        }

    }
    private void o_Leave(object sender, EventArgs e)
    {
        Control c = sender as Control;
        c.BackColor = SystemColors.Window;
    }

现在,在您需要此功能的每个表单构造器中

ControlColirizer _ccz;
public Form1() 
{ 
    InitializeComponent(); 
    // Create an instance of ControlColorizer, pass the background color 
    // the list of Controls and that's all 
    _ccz = new ControlColorizer(Color.LightYellow, this.TextBox1, 
               this.TextBox2, this.TextBox3, this.TextBox4);
}

答案 2 :(得分:1)

您可以自定义控件类,就像自定义任何类一样,您可以派生自己的类并覆盖虚拟方法。任意:

using System;
using System.Drawing;
using System.Windows.Forms;

class MyTextBox : TextBox {
    protected override void OnEnter(EventArgs e) {
        prevColor = this.BackColor;
        this.BackColor = Color.Cornsilk;
        base.OnEnter(e);
    }
    protected override void OnLeave(EventArgs e) {
        this.BackColor = prevColor;
        base.OnLeave(e);
    }
    private Color prevColor;
}

现在,您在表单上放置的任何MyTextBox都将具有此行为,而无需实现事件。虽然使用事件肯定没有错。