【问题标题】:About handling a custom Event关于处理自定义事件
【发布时间】:2013-10-10 17:44:54
【问题描述】:

如果我有这样的活动:

' <summary>
' Event raised when conversion progress changes.
' </summary>
Public Shared Event PercentDone(ByVal percent As Integer)

Sub(...)
    CoreConverter.StartInfo.FileName = CoreConverter_Location
    CoreConverter.Start()

    While Not CoreConverter.HasExited

        If ChrW(CoreConverter.StandardOutput.Read) = "*" Then
            progress += 1
            RaiseEvent PercentDone(progress)
        End If

    End While

    CoreConverter.Close()
    RaiseEvent Exited()

End sub

如何在其他类(例如默认的 Form1 类)中编写事件处理程序:

Sub Converter_Progress(Progress As Integer) Handles CoreConverter.PercentDone
     ' Some code...
End Sub

...而不是像这样手动添加处理程序:

AddHandler CoreConverter.PercentDone, AddressOf Converter_Progress

【问题讨论】:

    标签: .net vb.net winforms events event-handling


    【解决方案1】:

    为了使用Handles 关键字,您需要将变量声明为类中的字段(在类级别,而不是任何方法的本地),并使用WithEvents 关键字来执行此操作。例如:

    Public Class Test
        Private WithEvents Converter As New CoreConverter()
    
        Sub Converter_Progress(Progress As Integer) Handles Converter.PercentDone
            ' Some code...
        End Sub    
    End Class
    

    但是,我应该提一下,即使对于自定义事件,也建议您遵循事件处理程序委托的 .NET 约定,其中始终有两个参数:发送者和事件参数。最简单的方法是使用通用的EventHandler(Of T) 委托,例如:

    Public Class PercentDoneEventArgs
        Inherits EventArgs
    
        Public Property Progress As Integer
    End Class
    
    Public Class CoreConverter
        Public Event PercentDone As EventHandler(Of PercentDone)
    
        ' ...
    End Class
    

    然后,您的事件处理程序方法将如下所示:

    Sub Converter_Progress(sender As Object, e As PercentDoneEventArgs) Handles Converter.PercentDone
        ' ...
    End Sub
    

    【讨论】:

    • 谢谢,但是没有实例化类就没有办法做到这一点?,我的类没有 IDisposable,我知道如何创建一个 Dispose 过程但我不知道是否在这种情况是必要的,因为我需要实例化类来处理我想要的事件。和其他问题,如果我不问太多,我已经按照您关于创建事件的说明进行操作,但是“e”变量的值“Nothing”是否正确?只是我没有更多可以传递比进度值...我在这里放了一个“什么都没有”:RaiseEvent PercentDone(progress, Nothing)
    • 您不需要立即实例化一个对象作为声明的一部分。您可以简单地声明变量WithEvents,将其初始设置为Nothing,然后您可以将其设置为稍后引用您想要的任何对象。您可以随意更改它引用的对象,但显然,它一次只能引用一个对象。
    【解决方案2】:

    我认为您必须继承具有该事件的基类,然后您可以覆盖该事件,以便您的新类获取该事件,并且您的新类将事件重定向到基类。还是您需要别的东西?

    【讨论】:

      【解决方案3】:

      在声明类级实例(在您的情况下为“CoreConverter”)时,您必须使用“WithEvents”。例如:

      Private WithEvents CoreConverter As MyConverterType
      

      【讨论】:

        猜你喜欢
        • 2018-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-03
        • 2014-12-19
        相关资源
        最近更新 更多