Visual Studio 在多个按钮的 MouseEnter 事件上更改面板背景色

Visual Studio Change Panel BackColor on MouseEnter event for mutliple buttons


我是 C# 的新手,正在处理事件处理程序。 我的表格中有很多面板。如果我的鼠标悬停在它们上面,我希望它们改变颜色。我可以在 Form.cs 中为每个面板创建单独的函数。有没有更有效的方法?您可以通过事件传递参数并执行类似的操作并将所需的面板作为参数发送吗?
private void Panel_MouseEnter(object sender, EventArgs e, Panel p)
    {
        p.BackColor=System.Draw.etc;
    }

我如何从我的 Form.Designer.cs 中调用它?

面板其实就是发件人,你只需要Panel p = (Panel)sender;
因此,该事件实际上可以重新用于所有面板。

这意味着您可以将所有面板悬停事件注册到同一个函数。

完整代码:

private void Panel_MouseEnter(object sender, EventArgs e)
{
    Panel p = (Panel)sender;
    p.BackColor=System.Draw.etc;
}

你可以这样写:

private void Panel_MouseEnter(object sender, EventArgs e)
{
  var panel = sender as Panel;
  if ( panel != null ) 
    panel.BackColor = Color.White;
}

sender参数是引发事件的控件。

as 类型转换运算符 returns 如果实例类型错误则为 null。

所以我们检查是否为空并设置颜色。

然后您只需手动将此处理程序分配给每个面板的事件或您想要的任何控件。

或者您可以自动化,例如将所有需要的控件放在面板中并在某处写入,例如在表单加载事件处理程序中:

// Set for all panels in this panel but not recursively
MyContainerPanel.Controls.OfType<Panel>()
                         .ToList()
                         .ForEach(c => c.MouseEnter += Panel_MouseEnter);

// Set for all panels in the form but not recursively
Controls.OfType<Panel>()
        .ToList()
        .ForEach(c => c.MouseEnter += Panel_MouseEnter);

您还可以过滤名称,属性 甚至标签:

Controls.OfType<Panel>()
        .Where(c => c.Name.StartsWith("panelColorizable"))
        .ToList()
        .ForEach(c => c.MouseEnter += Panel_MouseEnter);

要递归赋值,你可以看看:

How to format all textbox values on LostFocus event in Winform

你也可以在鼠标离开时做同样的事情。