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

时间:2013-04-01 02:16:54

标签: c# winforms optimization button event-handling

在用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 个答案:

答案 0 :(得分:5)

您应该将单个MouseEnterMouseLeave连接到需要此功能的每个控件(而不是为每个控件编写每个方法的新版本)。假设您正在使用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是全球性的?如果在抓住相应的MouseEnter之前发生了针对另一个按钮的MouseLeave事件的“奇怪”事件,则可能会失去同步。为了使其更加健壮,我会考虑将旧颜色存储在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你可以在那里放任何东西,包括例如包含多个属性的自定义类,或者数组等,如果你需要用多个东西标记一个控件)。