【问题标题】:Raise an Event that changes a form from different class引发一个从不同类更改表单的事件
【发布时间】:2012-12-05 17:27:15
【问题描述】:

我想知道是否可以将事件从一个类制作和引发到一个表单?我有一个类,它只是不断地循环自己,但是当满足一个条件时,我希望一个按钮在表单上变得可见。我正在研究实现这一目标的不同方法。值得一提的是,我是多线程的,并且这个循环在与 UI 所在的线程不同的线程中运行。这就是为什么我希望有可能引发一个事件,这将跳转到 UI 线程并使按钮可见,然后返回到它在循环中的位置。

任何建议或方向表示赞赏。

【问题讨论】:

  • 请记住,每当您询问有关代码的问题时,请始终包含代码。

标签: vb.net winforms events event-handling


【解决方案1】:

这样的事情会起作用,

Public Class MyClass

   Public Event MyEvent()

   Sub DoStuff()
       RaiseEvent MyEvent
   End Sub
Public Class

Public Class MyForm 

    Public Sub HandleEvent()
         'can be called from another thread, so use invoke
         Me.Invoke(Sub() MyButton.Visible = true )
    End Sub

End Class

Dim mMyClass = New MyClass
Dim mMyForm = New MyForm 

AddHandler mMyClass.MyEvent, AddressOf mMyForm.HandleEvent()

如果您的事件来自另一个线程,只要您记得在更新 UI 时使用.Invoke,那么让表单处理来自任何来源的事件都没有问题。

【讨论】:

    【解决方案2】:

    我认为这是一个可能的解决方案:

    1) 将父表单作为参数传递给类; 2) 在父窗体中,调用函数

    Private Delegate Sub DoStuffDelegate()
    Private Sub DoStuff()
        If Me.InvokeRequired Then
            Me.Invoke(New DoStuffDelegate(AddressOf DoStuff))
        Else
            btn.Visible = true
        End If
    End Sub
    

    3) 在类中,将其称为 parentform.DoStuff()

    • 检查我输入的语法。

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2015-10-15
      • 2014-12-04
      相关资源
      最近更新 更多