ImageSource asynchron nachladen

  • WPF

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    ImageSource asynchron nachladen

    Servus,

    gibt es eine Option um ein BitmapImage asynchron nachzuladen?
    In meiner Anwendung sind mehrere Image(control)s untergebracht die ich gerne mit Bildern füttern würde - ohne den GUI-Thread zu blockieren.

    VB.NET-Quellcode

    1. Dim img as new BitmapImage()
    2. img.BeginInit()
    3. img.StreamingSource = Net.WebRequest.Create("http://mein-server.de/fuu/bild1").GetResponse.GetResponseStream()
    4. img.EndInit()
    5. devImage.Source = img


    devImage ist dabei das Imagecontrol in dem ich eben das Bild anzeigen lassen möchte. Funzt, aber hängt.

    Die andere Möglichkeit ist ein Förm(chen)provider in dem ich eine Picturebox einbaue.
    LoadAsync() funktioniert perfekt, ist aber eben nicht WPF und zerschießt mir das Layout...Also eigentlich keine Lösung

    Würd mich über Vorschläge freuen,
    noblubb
    Naja wie macht man etwas async?
    Genau neuer Thread.
    Mach nen neuen Thread erstellt dort die Source. Dann sagt img.Freeze() und mach über Dispatcher.BeginInvoke nen Aufruf wo dem Bild die Source zuweißt oder du machst es über Bindings. Da kannste dir das Sparen.
    Das Ganze Zeug im Codebehind ist natürlich immer so ne Sache. Besser ist es in WPF im XAML und wenn mit Code dann mit MVVM zu arbeiten. Ich weiß es zwar nicht genau aber es kann auch sein, dass der ImageSourceConverter oder wie auch immer der heißt auch URL's unterstützt und somit direkt darauf zugreifen kann. Ressourcen, Dateipfade,... kann er ja.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Der neue Thread will aber um mit Usercontrols arbeiten zu können ein STAThreadAttribute.
    Wenn er das bekommt mag er aber den Dispatcher von meiner Anwendung nicht mehr.
    Hin und herschubsen hakt ein bisschen...

    Also ich kann kein new BitmapImage erstellen und das dann per Invoke "versenden".
    Zumindest war das ohne Freeze() und "nur" mit Invoke() statt BeginInvoke. Ändert sich da was grundlegendes?

    XAML geht nicht, weil ich die Controls teils auch dynamisch erstellen will/muss - hätte ich erwähnen sollen.

    //ImageSourceConverter muss ich aber noch angucken
    So. Beides kurz gemixt, läuft eigentlich sehr gut, hängt aber noch kurz.
    Hat das mit der Verwendung von

    VB.NET-Quellcode

    1. System.Threading.ThreadPool.QueueUserWorkItem(AddressOf LoadingImage, New String() {path, cachepath})

    anstatt von einem neuen Thread zu tun? Ich dachte mir ich könnte ein bisschen Threads sparen ^^

    LoadingImage lädt wie beim Link von Samus Aran die Bilder herunter und lässt danach den Dispatcher und darin den ImageSourceConverter arbeiten (also Bild wieder aus dem Cache laden)

    //Ja hat es. Ist jetzt alles in einzelnen Threads untergebracht - funzt. Danke

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „noBlubb“ ()