自动更改活动控件的属性
本文关键字:控件 属性 活动 | 更新日期: 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);
}