我在表单的左侧有一个“菜单栏”。我要添加一个面板(用于菜单项的容器),图片框(图标)和标签(菜单文本)
我的最终目标是创建一个鼠标悬停事件,每次用户将鼠标悬停或离开菜单项时,该事件都会改变文本的颜色和前色。
我了解如何实现这一目标:
Private Sub Panel6_MouseEnter(sender As Object, e As EventArgs) Handles Panel6.MouseEnter
Panel6.BackColor = Color.LightGray
Label3.ForeColor = Color.Black
End Sub
Private Sub Panel6_MouseLeave(sender As Object, e As EventArgs) Handles Panel6.MouseLeave
Panel6.BackColor = Color.FromArgb(76, 76, 76)
Label3.ForeColor = Color.White
End Sub
根据菜单项的数量,这可能会非常无效。我的问题是,如何创建一个函数(我相信这就是我要寻找的功能),所以我可以为每个菜单项执行此操作,而不必为每个菜单项的每个控件使用代码。
答案 0 :(得分:1)
假设您正在使用WinForms,则可以执行以下操作:
MouseEnter
和MouseLeave
处理程序,使其不绑定到特定面板。您还可以为它们指定更多通用名称,例如Panel_MouseEnter
和Panel_MouseLeave
。PanelLabels
,在其中为每个面板放置相应的标签(在表单的加载事件处理程序中)。MouseEnter
和MouseLeave
事件处理程序,以使您可以使用sender参数来确定目标面板,并使用PanelLabels词典来确定目标标签。AddHandler
,将MouseEnter
和MouseLeave
事件处理程序明确绑定到每个面板。类似这样的东西:
Private ReadOnly PanelLabels As New Dictionary(Of Panel, Label)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
PanelLabels.Add(Panel1, Label1)
PanelLabels.Add(Panel2, Label2)
PanelLabels.Add(Panel3, Label3)
PanelLabels.Add(Panel4, Label4)
PanelLabels.Add(Panel5, Label5)
PanelLabels.Add(Panel6, Label6)
For Each panel In PanelLabels.Keys
AddHandler panel.MouseEnter, AddressOf Panel_MouseEnter
AddHandler panel.MouseLeave, AddressOf Panel_MouseLeave
Next
End Sub
Private Sub Panel_MouseEnter(sender As Object, e As EventArgs)
Dim panel = DirectCast(sender, Panel)
panel.BackColor = Color.LightGray
PanelLabels(panel).ForeColor = Color.Black
End Sub
Private Sub Panel_MouseLeave(sender As Object, e As EventArgs)
Dim panel = DirectCast(sender, Panel)
panel.BackColor = Color.FromArgb(76, 76, 76)
PanelLabels(panel).ForeColor = Color.White
End Sub
希望这会有所帮助。
编辑:
我刚刚看到,将鼠标悬停在面板内后,可能会出现一些不良行为。在这种情况下,将触发面板的MouseLeave事件。嗯。
编辑2:
您还可以使用PanelLabels中的注册将事件绑定到表单的load事件中的For循环中。这将进一步减小代码的大小。我已经相应地更新了代码。