Me.Dispatcher.Invoke wird nicht erkannt

  • WPF

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Eggord.

    Me.Dispatcher.Invoke wird nicht erkannt

    Hi,

    da sich ein Onbjekt bei mir im Program in einem anderen thread befinded wollte ich mittels Me.Dispatcher.invoke darauf zugreifen.

    Ganz einfach dachte ich. Naja aber VS sagt mir als das Dispatcher kein Member von meinem ViewModel ist. Achja und ich importiere auch system.threading

    hat einer eine Idee wodran das liegen könnte

    Hier mal kurz der code dazu:

    Quellcode

    1. Me.Dispatcher.Invoke(DirectCast(Sub()
    2. MessageBox.Show(" ")
    3. End Sub, Action))

    Eggord schrieb:

    aber VS sagt mir als das Dispatcher kein Member von meinem ViewModel ist.
    hat einer eine Idee wodran das liegen könnte
    Das liegt daran, dass Dispatcher kein Member von deinem Viewmodel ist.
    Weißt du, was ein Member ist?
    Falls nicht, fehlen dir Grundlagen. Grundlagen: Fachbegriffe (womit es aber nicht getan ist)

    guck dir die Dispatcher-Klasse im ObjectBrowser an.
    Halte Ausschau nach Shared Properties, die einen Dispatcher zurückgeben.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Eggord schrieb:

    VB.NET-Quellcode

    1. Me.Dispatcher.Invoke(DirectCast(Sub()
    Der Empfänger von Invoke / BeginInvoke ist ein Control im MainThread. Machst Du:

    VB.NET-Quellcode

    1. Me.Invoke(Sub()
    2. MessageBox.Show(" ")
    3. End Sub)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Eggord schrieb:

    Collection
    Was hat die mit Dispatcher zu tun?
    Hast Du mehrere GUIs in mehreren Threads laufen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nein ich habe nur einen aber ich bekomme beim debuggen immer den Hinweiß(für Collection), dass das Objekt von einem anderen Thread benutzt wird
    Und da ich das von dem UI thread mit invoke kenne dachte ich mir: das sollte auch hier funktionieren...Ok vielleicht war das nicht ganz so schlau wie ich dachte

    Eggord schrieb:

    von einem anderen Thread benutzt wird
    Meinst Du
    Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement Label1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.
    Probier dies nacheinander mit beiden Zeilen in der ThreadProc:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim tmr As System.Threading.Timer
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. tmr = New Threading.Timer(AddressOf ThreadProc)
    5. End Sub
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. tmr.Change(0, 100)
    8. End Sub
    9. Private Sub ThreadProc(state As Object)
    10. 'Me.Label1.Text = "bla" ' hier
    11. Me.BeginInvoke(Sub() Me.Label1.Text = "bla") ' und hier
    12. End Sub
    13. End Class

    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Kurz zur Fehlermeldung:
    "Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet

    Das Problem ist, dass es sich nicht einfach um ein label handelt. Es ist überhaupt nicht in XAML deklariert

    Eggord schrieb:

    XAML
    Sorry, WPF, hab ich überlesen. :whistling:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Es ist ein wenig kompliziert: also Die collection im VM binden and ein Control in XAML. Mit dieser Collection wird in dem Control Kommentare dargestellt. Jeder EIntrag ist also ein Kommentar in einem Graph(zum Beispiel eine Linie ein Pfeil eine Box). Wenn ich ein neues Objekt in die Collection rein stecke erscheint also das entsprechende Kommentar in dem Graph.
    Ich kann alle Eiegenschaften beim Erstellen veränndern. Aber wenn die Objekte einmal in der Collection drinnen sind, sind sie nicht mehr für mich "erreichbar".
    Ich könnte die Kommentare im UI per Maus verändern aber ich muss sie im VM verändern

    ich hoffe ich habe es ein wenig klarheit geschaffen
    ok habe es rausgelöst:
    Also die elemente in der collection sind UIElements.
    Das heißt ich muss nicht Me benutzen sondern das element aus der Collection:

    AnnotationCollection(x).Dispatcher.invoke.....

    Danke RodFromGermany