首页 > 解决方案 > 如何通过单击 Vb.net 中的控件来引发面板的单击事件

问题描述

我有一个自定义的 TableLayoutPanel:

Public Class CustomTLP
    Inherits TableLayoutPanel

    Private labelText As Label = New Label()

    Public Sub New([variousParam])

        [...]

        labelText.Text = "Hello Dolly!"
        Me.Controls.Add(labelText, 0, 0)

    End Sub
End Class

而且,在另一个类中,我创建了一个新的 CustomTLP 及其鼠标单击处理程序

Dim w As CustomTLP = New CustomTLP (Me, dName)
aFlowLayout.Controls.Add(w)
AddHandler w.MouseClick, AddressOf Me.ABeautifulOperation

问题是当我点击 CustomTLP 标签时,处理程序没有检测到事件。我想到的唯一解决方案是设置ABeautifulOperation为公共并从标签单击处理程序中调用它,但我认为这不是一个优雅的解决方案......有没有办法提高面板的点击事件?像这样的东西(在 CustomTLP 中):

AddHandler labelText.Click, AddressOf labelClicked

[...]

Private Sub labelClicked(sender As Object, e As EventArgs)
    ' Raise Me.MouseClick
End Sub

标签: vb.net

解决方案


正如 GSerg 所建议的,只需在单击 Label 时调用基本 OnClick() 方法:

Private Sub labelClicked(sender As Object, e As EventArgs)
    Me.OnClick(e)
End Sub

这是自定义标签的 VB 版本,它将忽略鼠标事件,从而允许父控件处理它们:

Public Class CustomLabel
    Inherits Label

    Protected Overrides Sub WndProc(ByRef m As Message)
        Const WM_NCHITTEST As Integer = &H84
        Const HTTRANSPARENT As Integer = (-1)

        If m.Msg = WM_NCHITTEST Then
            m.Result = New IntPtr(HTTRANSPARENT)
        Else
            MyBase.WndProc(m)
        End If
    End Sub

End Class

推荐阅读