Как я могу обновить элемент управления в другом потоке? - PullRequest
0 голосов
/ 04 мая 2020

Это моя ситуация, у меня есть одна кнопка в моей форме.

Когда я нажимаю на нее, я хочу, чтобы новый экземпляр 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 для добавления инициализированной картинки в элементы управления Form1:

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

, но затем, когда я нажимаю кнопку 1, я получаю исключение:
Invoke or BeginInvoke cannot be called on a control until the window handle has been created

Спасибо за помощь

1 Ответ

2 голосов
/ 05 мая 2020

Проблема в том, что 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
...