我在vb.net中创建了一个控件。现在我希望该控件发送一些消息(触发一个名为recieve的事件),实现它的父应用程序必须创建一个名为recieve的均值监听器并相应地执行操作。
答案 0 :(得分:8)
这段代码与@ user1057768的答案完全相同,但不用大惊小怪。事件处理程序抛出的任何异常都将通过OnReceive
方法返回,因此您可以在那里或类中的其他位置捕获它们。
Class MyClass
Public Event Recieve As EventHandler
Protected Overridable Sub OnReceive(e As EventArgs)
RaiseEvent Receive(Me, e)
End Sub
End Class
如果您需要特殊代码来处理或举起活动,则只需使用Custom Event
。
答案 1 :(得分:6)
Public Custom Event recieve As EventHandler
AddHandler(ByVal value As EventHandler)
_handlers.Add(value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
If _handlers.Contains(value) Then
_handlers.Remove(value)
End If
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
For Each handler As EventHandler In _handlers
Try
handler.Invoke(sender, e)
Catch ex As Exception
Debug.WriteLine("Exception while invoking event handler: " & ex.ToString())
End Try
Next
End RaiseEvent
End Event
然后您可以通过键入
来举起活动Dim raise As New System.EventArgs
RaiseEvent recieve(sender, raise)
代码中的任何位置。
答案 2 :(得分:3)
在您的控制类中,您必须声明一个公共事件
Class MyControl
Public Event MyReceivedEvent(ByVal AParameterIWantToSend As TheTypeOfThisParameter, ByVal AnotherParmeter As AnotherType, ...)
...
End Class
当您使用控件时,可能会将事件挂钩到xaml
中< MyControl x:Name="MyControlName" MyReceivedEvent="AHandlerForThisEvent" ... />
或在代码中:
AddHandler MyControlName.MyReceivedEvent, AddressOf AHandlerForThisEvent
Rq 1:您的活动可能没有参数。 Rq2:处理程序可以具有相同的参数,如果您不关心其中的一些参数,则可以使用更少的参数。把它们全部搞好是个好习惯。 Rq3:如果您不尊重事件的签名,您可以使用Delegates来获得更清晰的代码和警告/错误。喜欢在
Public Delegate Sub MyReceivedHandler(ByVal NumberOfItemsReceived As Integer, ByVal QualityOfReception As String, ByRef ReceptionHandled As Boolean)
然后用
挂钩你的处理程序AddHandler MyControlName.MyReceivedEvent, New MyReveivedHandler(AddressOf AHandlerForThisEvent)
如果使用此委托类型声明事件,则侦听器必须遵守EventHandler签名。
Public Event MyReceivedEvent As MyReceivedHandler
Rq4:您可以使用ByRef参数,就像在最新示例中一样,因此参数将发送到侦听器,可以更改,下一个侦听器将看到此参数的更新值。
Rq5:在简单的场景中,你可以使用lambda作为事件监听器,比如
AddHandler MyControlName.MyReceivedEvent, _
New MyReceivedHandler(Sub(ByVal num As Integer , ByVal Q As String, ByRef RHandled As Boolean) _
MessageBox.Show(" Message receiveived containing " & num & " items " & " of Quality : " & Q )