在我的桌面窗体中有很多控件。我想在焦点上更改该活动控件的背景颜色,并在失去焦点后返回其原始颜色。
这是我的代码,
public BillingMetal(Billing _frm)
{
this.frm = _frm;
InitializeComponent();
foreach (Control ctrl in this.Controls)
{
ctrl.GotFocus += ctrl_GotFocus;
ctrl.LostFocus += ctrl_LostFocus;
}
}
public void ctrl_LostFocus(object sender, EventArgs e)
{
var ctrl = sender as Control;
if (ctrl.Tag is Color)
ctrl.BackColor = (Color)ctrl.Tag;
}
public void ctrl_GotFocus(object sender, EventArgs e)
{
var ctrl = sender as Control;
ctrl.Tag = ctrl.BackColor;
ctrl.BackColor = Color.Red;
}
实际上这段代码是有效的,但仅适用于按钮,不适用于文本框、组合框或任何其他工具。
你的代码看起来基本上没问题,但你会想确保你也迭代了控制树的所有子节点(所有子节点......)。
public partial class BillingMetal : Form
{
public BillingMetal()
{
InitializeComponent();
foreach (var ctrl in IterateControls(Controls))
{
ctrl.GotFocus += (sender, e) =>
{
if(sender is Control ctrl)
{
ctrl.Tag = ctrl.BackColor;
ctrl.BackColor = Color.Red;
}
};
ctrl.LostFocus += (sender, e) =>
{
if(sender is Control ctrl && ctrl.Tag is Color color)
{
ctrl.BackColor = color;
}
};
}
}
迭代器
IEnumerable<Control> IterateControls(Control.ControlCollection controls)
{
foreach (Control control in controls)
{
yield return control;
foreach (Control child in IterateControls(control.Controls))
{
yield return child;
}
}
}
}