Lasse WPF-Bild asynchron laden

7

Ich möchte Gravatar-Images laden und sie von Code hinten auf ein WPF Image-Control setzen. Also sieht der Code wie

aus %Vor%

Wo GetGravatarImage aussieht:

%Vor%

Dies sperrt leider die GUI, wenn die Netzwerkverbindung langsam ist. Gibt es eine Möglichkeit, die Bildquelle zuzuweisen und das Bild im Hintergrund laden zu lassen, ohne die Benutzeroberfläche zu blockieren?

Danke!

    
user1130329 16.04.2013, 10:58
quelle

3 Antworten

19

Ich empfehle Ihnen, eine Bindung auf Ihrem imgGravatar von XAML zu verwenden. Setzen Sie IsAsync = true darauf und WPF verwendet automatisch einen Thread aus dem Thread-Pool, um Ihr Bild zu ziehen. Sie könnten die Auflösungslogik in einen IValueConverter kapseln und die E-Mail einfach als Quelle binden

in XAML:

%Vor%

im Code:

%Vor%     
JanW 16.04.2013 12:24
quelle
6

Ich kann nicht erkennen, warum Ihr Code die Benutzeroberfläche blockiert, da BitmapImage das Herunterladen von Bilddaten im Hintergrund unterstützt. Deshalb gibt es eine Eigenschaft IsDownloading und ein Ereignis DownloadCompleted .

Wie auch immer, der folgende Code zeigt eine einfache Möglichkeit, das Bild vollständig herunterzuladen und in einem separaten Thread (von ThreadPool ) zu erstellen. Es verwendet eine WebClient -Instanz, um den gesamten Bildpuffer herunterzuladen, bevor daraus ein BitmapImage erstellt wird Puffer. Nachdem das BitmapImage erstellt wurde, ruft es Freeze auf, um es über den UI-Thread zugänglich zu machen. Schließlich wird die Eigenschaft Source des Image-Steuerelements im UI-Thread mit einem Dispatcher.BeginInvoke -Aufruf zugewiesen.

%Vor%     
Clemens 16.04.2013 16:04
quelle
0

Vielleicht möchten Sie sich diese Frage ansehen:

Link

Und ich würde empfehlen, eine Asynchrone-Aufgabe zu starten und den Code, der in dieser Aufgabe async sein muss, zu setzen.

    
Bart Teunissen 16.04.2013 11:10
quelle

Tags und Links