如何在 c#.net 桌面应用程序中动态更改焦点工具的背景颜色

问题描述 投票:0回答:1

在我的桌面窗体中有很多控件。我想在焦点上更改该活动控件的背景颜色,并在失去焦点后返回其原始颜色。

这是我的代码,

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;
}

实际上这段代码是有效的,但仅适用于按钮,不适用于文本框、组合框或任何其他工具。

c# .net winforms controls backcolor
1个回答
0
投票

你的代码看起来基本上没问题,但你会想确保你也迭代了控制树的所有子节点(所有子节点......)。

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;
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.