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

本文关键字:事件处理 程序 共享 控件 | 更新日期: 2023-09-27 18:06:40

在我用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;
}

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

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

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

您应该将单个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是一个全局?如果发生了一些"奇怪"的事情,在相应的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,你可以把任何东西在那里,包括例如一个自定义类,包含多个属性,或一个数组,等,如果你需要标记一个控件与一个以上的东西)。