悬停在面板上;更改背景色和原色

时间:2019-04-06 04:48:42

标签: vb.net

我在表单的左侧有一个“菜单栏”。我要添加一个面板(用于菜单项的容器),图片框(图标)和标签(菜单文本)

我的最终目标是创建一个鼠标悬停事件,每次用户将鼠标悬停或离开菜单项时,该事件都会改变文本的颜色和前色。

我了解如何实现这一目标:

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

根据菜单项的数量,这可能会非常无效。我的问题是,如何创建一个函数(我相信这就是我要寻找的功能),所以我可以为每个菜单项执行此操作,而不必为每个菜单项的每个控件使用代码。

1 个答案:

答案 0 :(得分:1)

假设您正在使用WinForms,则可以执行以下操作:

  • 更新您的MouseEnterMouseLeave处理程序,使其不绑定到特定面板。您还可以为它们指定更多通用名称,例如Panel_MouseEnterPanel_MouseLeave
  • 创建一个专用字典PanelLabels,在其中为每个面板放置相应的标签(在表单的加载事件处理程序中)。
  • 以这种方式更新MouseEnterMouseLeave事件处理程序,以使您可以使用sender参数来确定目标面板,并使用PanelLabels词典来确定目标标签。
  • 在表单的加载事件处理程序中调用AddHandler,将MouseEnterMouseLeave事件处理程序明确绑定到每个面板。

类似这样的东西:

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循环中。这将进一步减小代码的大小。我已经相应地更新了代码。