Machen WPF-Bild laden, async
Ich würde gerne laden Gravatar-Bilder und legen Sie Sie aus dem code hinter einem WPF-Bild-Kontrolle.
Also der code sieht aus wie
imgGravatar.Source = GetGravatarImage(email);
Wo GetGravatarImage aussieht:
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri( GravatarImage.GetURL( "http://www.gravatar.com/avatar.php?gravatar_id=" + email) , UriKind.Absolute );
bi.EndInit();
return bi;
Leider sperrt die GUI, wenn die Netzwerkverbindung langsam ist. Gibt es eine Möglichkeit zum zuweisen der Bild-Quelle und lassen Sie es laden Sie das Bild im hintergrund ohne Blockierung der UI?
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie verwenden eine Verbindliche, auf Ihre imgGravatar von XAML. Set IsAsync=true auf es und WPF automatisch nutzen, ein thread aus dem threadpool, ziehen Sie Ihr Bild. Könnten Sie Kapseln die Lösung von Logik in IValueConverter und einfach binden Sie die E-Mail als Quelle
in XAML:
Code:
ThreadPool
weil Sie zu bewältigen haben, ist der Versand die ganze Zeit. Dies macht es nicht elegant genug, um mich für eine Reine MVVM-Anwendung.IsDownloading
Eigentum undDownloadCompleted
Veranstaltung. Wenn Sie einfach ein Bild-SteuerelementSource
Eigenschaft im XAML-Code auf eine URL, die sich auf ein großes Bild auf der web-UI nicht blockieren. Stattdessen WPF downloads das Bild im hintergrund und zeigt, dass es, sobald der download abgeschlossen ist.BitmapImage
auf einem hintergrund-thread. Das UI hängt nur im moment des Ladens der Bild-Daten in der UI. Sorry für die Verwirrung. Der Download startet nach derBitmapImage
zugeordnet ist alsSource
und nicht mitBeginInit()
. Also im Grunde original-code aus, in dem der Autor arbeiten. Also vielleicht hat es etwas todo mit der Menge der Bilder, die er verwendet auf seiner Benutzeroberfläche.IsAsync
auf true binden, dies beeinflusst nur, wie die Eigenschaft getter aufgerufen wird, aber nicht die Bindung Konverter. Der Konverter ist immer noch im UI-thread aufgerufen. Es tut sich einfach nicht blockieren der UI-thread, daBitmapImage
nicht.Ich kann nicht sehen, warum der code-block der Benutzeroberfläche, als BitmapImage unterstützt das herunterladen von Bild-Daten im hintergrund. Das ist, warum es hat eine
IsDownloading
Eigenschaft und eineDownloadCompleted
Veranstaltung.Jedenfalls der folgende code zeigt eine einfache Möglichkeit zum herunterladen und erstellen Sie das Bild komplett in einem separaten thread (von der
ThreadPool
). Es verwendet eineWebClient
Instanz zum download des gesamten Bild-Puffer vor der Erstellung eines BitmapImage aus, dass die Puffer. Nach dem BitmapImage wird erstellt, er ruftEinfrieren
zugänglich zu machen aus dem UI-thread. Schließlich weist das Bild-Steuerelement istSource
Eigenschaft in der UI-thread durch eineDispatcher.BeginInvoke
nennen.EDIT: heute würden Sie nur verwenden Sie asynchrone Methoden: