无论鼠标是否在子控件上,都更改控件的背景颜色

Change background color of control regardless if mouse is over a child control

我正在制作一个自定义控件,想法是当鼠标在控件上时,背景颜色不同,当鼠标不再在控件上时,return 为原始颜色。

一个问题是当鼠标悬停在子控件上时没有任何反应

我已经尝试为所有子控件分配一个通用的鼠标悬停事件处理程序,但是无论如何,当鼠标快速移动时什么也没有发生。

我想要一个类似于按钮控件的行为,无论鼠标移动多快,背景颜色似乎都没有问题

所有子项必须共享来自父项的 MouseEnter 事件将访问的相同方法,因为否则,当您的鼠标悬停在子项上时,它将引发父项的 MouseLeave 事件。

这是一个例子:

public partial class Test : Form
{
    public Test()
    {
        InitializeComponent();
        myPictureBox1.MouseEnter += (sender, e) => { AllControls_MouseEnter(); };
        myLabel1.MouseEnter += (sender, e) => { AllControls_MouseEnter(); };
        myLabel2.MouseEnter += (sender, e) => { AllControls_MouseEnter(); };
    }

    private void Panel_MouseEnter(object sender, EventArgs e)
    {
        AllControls_MouseEnter();
    }

    private void Panel_MouseLeave(object sender, EventArgs e)
    {
        AllControls_MouseLeave();
    }

    private void AllControls_MouseEnter()
    {
        Panel.BackColor = Color.Firebrick;
    }

    private void AllControls_MouseLeave()
    {
        Panel.BackColor = Color.White;
    }
}

当然,myPictureBox1myLabel1myLabel2Panel 的子代,你可以猜到。

或者如果你有很多控件,你可以遍历所有 Controls 父集合(这是我会选择的方法,而不是分配给所有控件),像这样:

foreach (var c in Panel.Controls)
{
    ((Control)c).MouseEnter += (sender, e) => { AllControls_MouseEnter(); };
}

这是测试表格的演示(带和不带 foreach...):