请认为我是c#的新手。在扫描了大约700个帖子后,我决定再发一个问题:
在我的Windows窗体(c#)上,我有一些控件,包括文本框,复选框等。 我想在控件变为活动状态时更改背景颜色。 我知道我可以为每个控件引发'enter'和'leave'事件来改变相应的属性,但应该有另一种方式。
答案 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都将具有此行为,而无需实现事件。虽然使用事件肯定没有错。