自动更改活动控件的属性

本文关键字:控件 属性 活动 | 更新日期: 2023-09-27 18:26:28

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

在我的windows窗体(c#)上,我有一些控件,包括文本框、复选框等等。每当控件激活时,我想更改背景颜色。我知道我可以为每个控件引发"回车"answers"离开"事件来更改相应的属性,但应该有另一种方法。

自动更改活动控件的属性

只需勾选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;
                            };
    }
}

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

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都将具有此行为,而不必实现事件。尽管使用事件肯定没有错。

创建一个类(例如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);
}