在用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;
}
由于我有很多按钮,更改按钮边框颜色的代码占用了大量空间。
有没有更简单的方法可以做到这一点?
答案 0 :(得分:5)
您应该将单个MouseEnter
和MouseLeave
连接到需要此功能的每个控件(而不是为每个控件编写每个方法的新版本)。假设您正在使用Visual Studio,可以通过在每个Button的属性窗格中更改事件的目标方法名称来完成此操作。如果您首先编写以下代码,则此方法将显示在属性的MouseEnter
和MouseLeave
事件'下拉列表中。
然后,代码需要检查触发事件的按钮,如下所示:
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
你可以在那里放任何东西,包括例如包含多个属性的自定义类,或者数组等,如果你需要用多个东西标记一个控件)。