在多个控件之间共享事件处理程序

6
在我用C#编写的Windows窗体应用程序中,有许多按钮。当用户将鼠标悬停在按钮上时,我希望按钮的边框发生变化。
目前,我有多个这样的实例(每个按钮都有一份):
private void btnStopServer_MouseEnter(object sender, EventArgs e)
{
    oldColor = btnStopServer.FlatAppearance.BorderColor;
    btnStopServer.FlatAppearance.BorderColor = mouseOverColor;
}

private void btnStopServer_MouseLeave(object sender, EventArgs e)
{
    btnStopServer.FlatAppearance.BorderColor = oldColor;
}

由于我有很多按钮,改变按钮边框颜色的代码占用了很多空间。

有没有更简单的方法可以做到这一点?

1个回答

7
你需要为每个需要此功能的控件连接单个MouseEnterMouseLeave,而不是为每个控件编写新版本的方法。假设您使用的是Visual Studio,可以通过更改每个按钮的属性窗格中事件的目标方法名称来完成这项任务。如果您首先编写以下代码,则该方法将出现在属性的MouseEnterMouseLeave事件下拉列表中。
然后,代码需要检查从哪个按钮触发了事件,如下所示:
private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e)
{
    Button eventButton = (Button) sender;
    oldColor = eventButton.FlatAppearance.BorderColor;
    eventButton.FlatAppearance.BorderColor = mouseOverColor;
}

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e)
{
    Button eventButton = (Button) sender;
    eventButton.FlatAppearance.BorderColor = oldColor;
}

我猜想oldColor是一个全局变量?如果在相应的MouseLeave事件被捕获之前,你的MouseEnter事件被触发到了另一个按钮上,那么这个可能会失去同步。为了使其更加健壮,我建议将旧颜色存储在按钮的.tag属性中,这样它就是自包含的。
例如:
private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e)
{
    Button eventButton = (Button) sender;
    eventButton.tag = eventButton.FlatAppearance.BorderColor;
    eventButton.FlatAppearance.BorderColor = mouseOverColor;
}

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e)
{
    Button eventButton = (Button) sender;
    eventButton.FlatAppearance.BorderColor = (Color)eventButton.tag;
}

这个标签基本上是一个钩子,用于标记与特定控件实例相关的“任何”内容,而没有已经存在的属性。它的类型为Object,这意味着您可以在那里标记任何东西,但当您从中读取时,需要将其强制转换回您在第一次放置时的任何类型。但由于它是一个Object,您可以在其中放置任何东西,包括例如包含多个属性的自定义类或数组等,如果您需要用多个东西标记控件。


谢谢!正是我想要的。 - davidweitzenfeld
@davidwroxy 绝对是我的荣幸,感谢你的接受!我注意到你很少“接受”其他(可能)回答了你的问题。如果你有时间,是否可以将那些已经解决了你的问题的答案标记为“接受”,或者给那些对你有用的答案点个赞呢? - Sepster
我刚刚完成了标记解决我的问题的答案。我忘记做这件事了。谢谢你提醒我。 - davidweitzenfeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接