vb.net - 如何通过单击 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
解决方案
正如 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
推荐阅读
- c# - 威胁已经被清除了。@System.IO.File.InternalReadAllBytes(字符串路径,布尔检查主机)
- localization - TYPO3 定位器扩展 - 购物车配置
- javascript - 缓冲区 TurfJS 的传单控制层
- javascript - 如果用户点击外部,我如何隐藏我的下拉菜单
- typescript - 实现接口的对象中函数语法的 typescript/eslint 规则
- sql - 仅获取满足条件的前 N 行,但保留不满足条件的行
- java - 拦截 Spring Cloud Stream 目标绑定以动态修改生产者属性
- asp.net - ASP .NET Core 发布错误 AddDbContext
- java - RatingBar DialogFragment 关闭后,Android 应用程序崩溃
- python - 检测输入是否指定 discord.py