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

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

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

4

1 回答 1

7

您应该将单个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你可以放任何东西的地方,包括例如一个包含多个属性的自定义类,或者一个数组等,如果你需要标记一个控件不止一件事)。

于 2013-04-01T02:23:13.003 回答