跨多个控件共享事件处理程序
在用C#编写的Windows窗体应用程序中,我有一堆按钮。 当用户的鼠标hover在按钮上时,我希望按钮的边框发生变化。
目前我有以下多个实例(每个按钮的副本):
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; }
由于我有很多按钮,更改按钮边框颜色的代码占用了大量空间。
有没有更简单的方法可以做到这一点?
您应该将单个MouseEnter
和MouseLeave
到需要此function的每个控件(而不是为每个控件编写每个方法的新版本)。 假设您正在使用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
是全球性的吗? 如果在捕获相应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
你可以在那里放任何东西,包括例如包含多个属性的自定义类,或者如果你需要标记一个数组等等控制不止一件事)。