Hallo miteinander,
ich entwickle unter VB.NET in Visual Studio 2017. Dabei habe ich gerade eine Applikation, in welcher ich einen Thread aus System.Threading kreiert habe.
In diesem Thread instanziiere ich einen WPF-XAML-basierende GUI-Dialog, dieser sieht wie folgt aus:
Diese Klasse ist einem eigenen File implementiert.
Innerhalb meines Threads instanziiere ich sie wie folgt:
Und in der ersten Zeile crasht mein Thread und ich erhalte folgende Exception: "Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies
für viele Komponenten der Benutzeroberfläche erforderlich ist."
Ich weiß, daß dies damit zusammenhängt, daß man nicht so ohne weiteres auf eine GUI von einem anderen Thread aus zugreifen darf, welche in einem anderen
Thread erzeugt wurde.
Und ich weiß auch, daß es einige Mechanismen wie Invokes, Delegates usw. gibt. Allerdings habe ich es noch nicht geschafft, die ganze EingabeDialog-Klasse als Delegat
auszuführen bzw. sie zu invoken. In den gefundenen Beispielen im Internet konnte ich immer nur einzelne Controls wie Buttons, Textfelder usw. sehen, auf welchen ein
Delegat ausgeführt wurde, nicht jedoch eine ganze GUI-Klasse wie in meinem Fall.
Hat jemand eine Idee, wie ich das Problem lösen kann?
Verschoben. Code-Tags eingefügt. ~Thunderbolt
ich entwickle unter VB.NET in Visual Studio 2017. Dabei habe ich gerade eine Applikation, in welcher ich einen Thread aus System.Threading kreiert habe.
In diesem Thread instanziiere ich einen WPF-XAML-basierende GUI-Dialog, dieser sieht wie folgt aus:
VB.NET-Quellcode
- Class EingabeDialog
- Private ReadOnly InitialerPlatzhalterText As String = String.Empty
- Sub New(ByVal Title As String, ByVal SetAsTopMost As Boolean, ByVal PlaceHolderText As String)
- ' Dieser Aufruf ist für den Designer erforderlich.
- InitializeComponent()
- InitialerPlatzhalterText = PlaceHolderText
- TextInputFeld.Text = PlaceHolderText
- Me.Title = Title
- Topmost = SetAsTopMost
- End Sub
- Private Sub BtnDialogOk_Click(sender As Object, e As RoutedEventArgs)
- DialogResult = True
- End Sub
- Public ReadOnly Property EnteredInput As String
- Get
- Return TextInputFeld.Text
- End Get
- End Property
- Private Sub TxtEnteredInput_GotFocus(sender As Object, e As RoutedEventArgs)
- If Trim(TextInputFeld.Text) = InitialerPlatzhalterText Then
- TextInputFeld.Text = String.Empty
- End If
- End Sub
- Private Sub TxtEnteredInput_LostFocus(sender As Object, e As RoutedEventArgs)
- If Trim(TextInputFeld.Text) = String.Empty Then
- TextInputFeld.Text = InitialerPlatzhalterText
- End If
- End Sub
- Private Sub BtnDialogCancel_Click(sender As Object, e As RoutedEventArgs)
- DialogResult = False
- End Sub
- End Class
Diese Klasse ist einem eigenen File implementiert.
Innerhalb meines Threads instanziiere ich sie wie folgt:
Und in der ersten Zeile crasht mein Thread und ich erhalte folgende Exception: "Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies
für viele Komponenten der Benutzeroberfläche erforderlich ist."
Ich weiß, daß dies damit zusammenhängt, daß man nicht so ohne weiteres auf eine GUI von einem anderen Thread aus zugreifen darf, welche in einem anderen
Thread erzeugt wurde.
Und ich weiß auch, daß es einige Mechanismen wie Invokes, Delegates usw. gibt. Allerdings habe ich es noch nicht geschafft, die ganze EingabeDialog-Klasse als Delegat
auszuführen bzw. sie zu invoken. In den gefundenen Beispielen im Internet konnte ich immer nur einzelne Controls wie Buttons, Textfelder usw. sehen, auf welchen ein
Delegat ausgeführt wurde, nicht jedoch eine ganze GUI-Klasse wie in meinem Fall.
Hat jemand eine Idee, wie ich das Problem lösen kann?
Verschoben. Code-Tags eingefügt. ~Thunderbolt
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()