У меня есть WPF dll, которая содержит несколько классов Window и предоставляет методы, которые отображают эти окна.
У меня также есть отдельный проект WinForms, который вызывает один из этих методов в проекте WPF внутри метода DoWork компонента BackgroundWorker.
В строке кода, которая создает экземпляр окна WPF, я получаю следующую ошибку времени выполнения:
Вызывающий поток должен быть STA, потому что это требуется для многих компонентов пользовательского интерфейса.
Поиск в Google позволил мне это обсуждение . (Оказывается, Джон Скит отвечает на вопросы на других сайтах, помимо переполнения стека!)
Компонент BackgroundWorker хорошо работает с WPF ...
В этой статье также упоминается использование класса DispatcherObject, но я не понимаю, как заставить это работать, и я предпочел бы просто продолжать использовать свой компонент BackgroundWorker.
В качестве контрольного примера я придумал следующий код для воспроизведения ошибки. В библиотеке классов WPF приведен код в Window1.xaml.vb
Partial Public Class Window1
Public Shared Function ShowMe() As Boolean?
Dim w = New Window1 'Error appears on this line.
Return w.ShowDialog()
End Function
End Class
В приложении WinForms вот код в Form1.vb
Imports System.ComponentModel
Public Class Form1
Private WithEvents worker As BackgroundWorker
Private Sub doWord(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles worker.DoWork
WpfLibrary.Window1.ShowMe()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
worker = New BackgroundWorker
worker.RunWorkerAsync()
End Sub
End Class
Даже если компонент BackgroundWorker помещен в сам Window1.xaml.vb, возникает та же ошибка. Итак, эта статья неправильна, и я не могу использовать BackgroundWorker с WPF? Или мне нужно что-то еще сделать, чтобы заставить его работать?
Если BackgroundWorker не будет работать, то как мне заменить код в Form1.vb выше, чтобы вместо него использовать Dispatcher?