如何更新另一个线程上的控件?

问题描述 投票:-1回答:1

我的情况是这样的,我的表单上有一个按钮,当我点击它时,我想让MyNewClass的新实例在我的表单上出现一个Picturebox。

当我点击它时,我想让MyNewClass的一个新实例在我的表单上出现一个Picturebox。

Public Class Form1
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim fooThread As New Threading.Thread(Sub() Foo())
        fooThread.Start()
    End Sub
    Private Sub Foo()
        Dim myInstance = New MyNewClass()
    End Sub
End Class

Public Class MyNewClass
    Public Sub New()
        Dim testControl = New PictureBox()
        testControl.BackColor = Color.Green
        Form1.Controls.Add(testControl)
    End Sub
End Class

问题是,当我点击这个按钮时,什么都没有出现。我试过使用Invoke方法来添加初始化的Picturebox到Form1控件中。

        Form1.Invoke(Sub() Form1.Controls.Add(testControl))

但当我点击Button1时,我得到一个异常。Invoke or BeginInvoke cannot be called on a control until the window handle has been created

谢谢你的帮助

.net vb.net multithreading user-interface instance
1个回答
2
投票

问题是YourNewClass并不像你所期望的那样知道Form1。你必须在全局变量中引入它。这段代码可以工作。

Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    MyForm = Me
    Dim fooThread As New Threading.Thread(Sub() Foo())
    fooThread.Start()
End Sub
Private Sub Foo()
    Dim myInstance = New MyNewClass()
End Sub
End Class

Public Class MyNewClass
    Public Sub New()
        Dim testControl = New PictureBox()
        testControl.BackColor = Color.Green
        MyForm.Invoke(Sub() MyForm.Controls.Add(testControl))
    End Sub
End Class

Public Module Module1
    Public MyForm As Form
End Module
© www.soinside.com 2019 - 2024. All rights reserved.