2013-10-10 78 views
0

如果我有这样的一个事件:关于处理自定义事件

' <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 

回答

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 
+0

三江源,但后来就没有办法做没有实例化类,我的类没有IDisposable,我知道如何创建一个Dispose过程,但我不知道的是,如果在这种情况下是必要的,因为我需要实例化类来处理事件,因为我想。和其他问题,如果我没有问太多,我已经遵循了关于事件创建的指示,但是“Nothing”的值对于“e”变量是正确的,只是我没有更多的要通过比进度值,所以...我在这里提出了一个“没有”:RaiseEvent PercentDone(progress,Nothing) – ElektroStudios

+0

你不需要立即实例化一个对象作为声明的一部分。你可以简单地声明变量'WithEvents',最初将它设置为'Nothing',然后你可以将它设置为在以后引用任何你想要的对象。您可以随时更改其引用的对象,但显然它一次只能引用一个对象。 –

1

我认为你将不得不继承具有EV基类那么你可以覆盖事件,然后你的新类获取事件,而你的新类将事件重定向到基类。还是你需要别的东西?

1

当声明你的类级别的实例时(你的情况是“CoreConverter”),你必须使用“WithEvents”。例如:

Private WithEvents CoreConverter As MyConverterType