Im Thread kein Zugriff auf die WPF Steuerelemente?

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Sara.

    Im Thread kein Zugriff auf die WPF Steuerelemente?

    Hallo ich habe ein kleines Problem mit einer While True Schleife mit WPF

    Folgender Code funktioniert nicht.
    Die While Scheife blockiert die WPF Anzeige.

    VB.NET-Quellcode

    1. Class MainWindow
    2. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    3. While True
    4. End While
    5. End Sub
    6. End Class

    Dann habe ich mir gedacht ich nutze einen Thread.

    VB.NET-Quellcode

    1. Imports System.Threading
    2. Class MainWindow
    3. Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs)
    4. Dim s As New Thread(AddressOf test)
    5. s.Start()
    6. End Sub
    7. Private Sub test()
    8. While True
    9. LBL_Test.content = "test"
    10. End While
    11. End Sub
    12. End Class

    Das klappt auch.
    Doch leider funktioniert

    VB.NET-Quellcode

    1. LBL_Test.content = "test"

    nicht.

    Ich habe keinen Zugriff auf die WPF Steuerelemente.

    Ich dachte ich kann immer auf die WPF Steuerelemente zugreifen?
    Was muss ich ändern.

    Viele Grüße Sara
    Das ist so auch nicht richtig, WPF ist kein WinForms, da nutzt man MVVM und Bindings und trennt das alles schön sauber, da spricht man nicht im Codebehind einfach so UI-Controls an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Zum Üben (und sonst eigentlich auch) ist es völlig okay, das Codebehind zu nutzen. MVVM bietet zwar viele Vorteile, muss aber nicht verwendet werden und vorallem bei kleineren Fenstern ist es einfach nur unnötige Arbeit und schadet meiner Meinung nach der Übersicht (wenn du für jedes kleine Fenster auch noch ein ViewModel hast).


    In WPF musst du genauso, wie in WinForms eigentlich auch (solange man es nicht ausschaltet, was aber eine Totsünde ist ;) ), in den Hauptthread, also in den, in dem die Steuerelemente laufen, Invoken. Das geht über den Dispatcher. Du kannst einfach schreiben:

    VB.NET-Quellcode

    1. ​Me.Dispatcher.Invoke(Sub() LBL_Test.content = "test")

    oder

    VB.NET-Quellcode

    1. LBL_Test.Dispatcher.Invoke(Sub() LBL_Test.content = "test")

    oder

    VB.NET-Quellcode

    1. Application.Current.Dispatcher.Invoke(Sub() LBL_Test.content = "test")


    MVVM hat mit dem Problem nämlich gar nichts zu tun, da musst du auch invoken.
    Mfg
    Vincent

    VincentTB schrieb:

    MVVM hat mit dem Problem nämlich gar nichts zu tun

    Das hatte ich auch nicht gesagt, ging nur generell darum, dass man es imo nutzen sollte, zum Üben ist es aber vorerstmal in Ordnung, aber das wusste ich ja nicht. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hallo zusammen,
    es hat mit den Beispielen von VincentTB super geklappt.
    Was mich etwas verwundert ist, dass im Kofler Threading eindeutig im im WPF Teil steht.
    Aber gut das Buch ist ja schon etwas älter.
    MVVM konnte ich im nicht Buch finden.
    Bindings kommen im Kapitel XML vor.

    Trade, ist deine Vorschlag eine neuere Lösung?

    Viele Grüße Sara
    Mein Vorschlag handelt nur von einem anderen Konzept, das normalerweise in WPF verwendet wird, d. h. die Beziehungen zwischen Window und Code sind etwas anders.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: