gpt4 book ai didi

vb.net - 在 VB.NET 中重定向事件

转载 作者:行者123 更新时间:2023-12-04 06:56:53 25 4
gpt4 key购买 nike

我有一个 UserControl1 (在女巫我有一个 Label1 )在 Form1 .我想 catch MouseDown来自 Label 的事件并像来自 UserControl 一样发送它。

我愿意:

Public Class UserControl1
Shadows Custom Event MouseDown As MouseEventHandler

AddHandler(ByVal value As MouseEventHandler)
AddHandler Label1.MouseDown, value
End AddHandler

RemoveHandler(ByVal value As MouseEventHandler)
RemoveHandler Label1.MouseDown, value
End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal e As MouseEventArgs)
'RaiseMouseEvent(Me, e) ??? '
End RaiseEvent

End Event

End Class

但是,当我在 Form1 中设置 UserControl
  Private Sub UserControl11_MouseDown(ByVal sender As System.Object, _ 
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles UserControl11.MouseDown

' here I have "Label", BUT want "UserControl" '
MessageBox.Show(sender.GetType.Name)
End Sub

一个细节.. 我希望事件应该是 仅在标签 上,而不是整个用户控件。

最佳答案

为什么不直接处理“老派”事件并委托(delegate)它,而不是创建自定义事件?像这样:

' In the user control: '
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) _
Handles Label1.MouseDown
OnMouseDown(e)
End Sub

现在,当您处理 UserControl.MouseDown表单中的事件,事件的发送者将是用户控件实例。

如果您只想捕获标签上的点击(而不是整个用户控件),那么您可以覆盖 OnMouseDown测试点击的来源:
Private m_MouseDownFromLabel As Boolean = False

Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) _
Handles Label1.MouseDown
m_MouseDownFromLabel = True
OnMouseDown(e)
End Sub

Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If m_MouseDownFromLabel Then
m_MouseDownFromLabel = False
MyBase.OnMouseDown(e)
End If
End Sub

由于只有一个 UI 线程,这在面对竞争条件时应该是安全的。

顺便说一句: RaiseMouseEvent不能在这里使用,因为第一个参数是 MouseDown事件属性。但是,不能从派生类访问此属性,只能在 Control 内部访问。类本身。不知道为什么 RaiseMouseEvent当它无论如何都不能从派生类中使用时,它本身不是私有(private)的,而是受到保护的。

关于vb.net - 在 VB.NET 中重定向事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2455760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com