使用WithEvents为VB.NET中的GUI应用程序创建全局事件处理程序

时间:2014-06-15 06:34:16

标签: .net vb.net events user-interface event-handling

为了熟悉VB,我正在为cli应用程序的前端工作,方法是从用户那里获取输入并将其作为命令行参数提供给所述后端应用程序。这是repository的链接,供任何类型的参考。 另外,我对VB / GUI编程还不熟悉,所以请原谅我必须错过的显而易见的事情。

我思考过程的一点背景:

以下是我认为我会在应用程序中处理事件来构建我的args字符串,请原谅我,如果我太冗长,但我认为最好尽可能地描述我正在做的事情。在我告诉确切的问题之前

  1. GUI有各种组件
  2. 每个组件都有相关的公开事件
  3. 类(ArgBuilder)在后台侦听这些事件并更新相关变量
  4. “确定”按钮的处理程序,实例化此类以获取命令,并使用已有的可执行文件创建新的后台进程。
  5. 问题:

    我的问题在于(3),每当我试图说,从CtlInputFile类(或任何Class.PublicEventFromThatClass)处理InFileSelected事件时,我得到一个错误Handles clause requires WithEvents variable defined in the containing type or one of its base types

    到目前为止,MSDN articles已经有所帮助,但是这个问题有点难以理解。

    我将这节课作为一个例子说错过了什么:

    Public Class CtlInputFile
        Public Event InFileSelected(ByVal inFileName As String)
        Dim inFileName As String
    
        ' Proxy Init Module
        Private Sub ctlInputFile_Initialize()
            inFileName = String.Empty
        End Sub
    
        ' Event handlers below
    End Class
    

    应该能够捕获CtlInputFile.InFileSelected(inFileName)

    的全局事件监听器
    Public Class ArgBuilder
        ' Create getters and setters for all relevant vars in the project
        ' Capture events from all over the place
        Dim inFileName As String
    
        Private Sub ctlInputFile_FileSelected(ByVal inFilename As String) Handles _
        ctlInput.InFileSelected
            ' Do something useful
        End Sub
    
    End Class
    

    再次,谢谢!

1 个答案:

答案 0 :(得分:1)

如果您看到Handles Button1.Click之类的内容,则表示有一个像这样定义的对象

Public WithEvents Button1 As New Button

此代码通常位于表单的Designer文件中(您需要选择“显示所有文件”才能看到它)。这允许您通过将Handles子句添加到具有正确声明的方法来处理此事件。

在您的情况下,您需要创建对象ctlInput,如

Public WithEvents ctlInput As New CtlInputFile

如果您想使用Handles子句。 另一种可能性是使用AddHandler

手动连接事件
Addhandler ctlInput.InFileSelected, AddressOf ctlInputFile_FileSelected

即使没有WithEvents语句也可以。

如果你想拥有一个处理事件的中心位置,那么最后一个就是要走的路。您可以将事件处理代码放在模块中,也可以在类中使用静态方法(共享):

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler Me.ResizeEnd, AddressOf EventHandlers.FormResized
    End Sub
End Class

Public Class EventHandlers
    Public Shared Sub FormResized(sender As Object, e As EventArgs)
        MsgBox(sender.ToString & " was resized!")
    End Sub
End Class

然后在启动期间连接事件。