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!
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% 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.
Vielleicht möchten Sie sich diese Frage ansehen:
Und ich würde empfehlen, eine Asynchrone-Aufgabe zu starten und den Code, der in dieser Aufgabe async sein muss, zu setzen.
Tags und Links wpf image asynchronous