跨多个控件共享事件处理程序

在用C#编写的Windows窗体应用程序中,我有一堆按钮。 当用户的鼠标hover在按钮上时,我希望按钮的边框发生变化。

目前我有以下多个实例(每个按钮的副本):

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

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

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

您应该将单个MouseEnterMouseLeave到需要此function的每个控件(而不是为每个控件编写每个方法的新版本)。 假设您正在使用Visual Studio,可以通过在每个Button的属性窗格中更改事件的目标方法名称来完成此操作。 如果您首先编写以下代码,则此方法将出现在属性的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事件的地方发生“奇怪”事件,则可能会失去同步。 为了使其更加健壮,我会考虑将旧颜色存储在Button的.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你可以在那里放任何东西,包括例如包含多个属性的自定义类,或者如果你需要标记一个数组等等控制不止一件事)。