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