Vorrei caricare Gravatar-Images e impostarle da codice dietro a un Image Control di WPF. Così il codice è simileEffettua il caricamento dell'immagine WPF asincrono
imgGravatar.Source = GetGravatarImage(email);
Dove GetGravatarImage assomiglia:
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;
Purtroppo questo blocca la GUI quando la connessione di rete è lenta. C'è un modo per assegnare l'origine dell'immagine e lasciar caricare l'immagine sullo sfondo senza bloccare l'interfaccia utente?
Grazie!
BitmapImage ha anche un [costruttore con il parametro Uri] (http://msdn.microsoft.com/en-us/library/ms602473.aspx), che si salverebbe le chiamate/EndInit BeginInit. – Clemens
+1 non lo sapevo, bel suggerimento. Ho appena copiato il codice dall'autore e non ho pensato a come ottimizzare il download effettivo, invece mi sono concentrato sulla risoluzione del problema del blocco dell'interfaccia utente in modo elegante (e ovviamente blocca, se il codice non è asincrono). Penso che per l'uso ripetitivo, il convertitore potrebbe anche ottenere l'URL completo dall'associazione per essere più riutilizzabile, anziché l'e-mail. Non mi piace usare 'ThreadPool' perché devi gestire l'invio tutto il tempo. Questo non lo rende abbastanza elegante per una pura applicazione MVVM. – JanW
Puoi fornire una spiegazione sul perché la creazione di un BitmapImage si blocchi quando non viene chiamata in modo asincrono. Perché allora ha la proprietà 'IsDownloading' e l'evento' DownloadCompleted'. Se si imposta semplicemente la proprietà 'Origine' di controllo immagine in XAML su un URL che fa riferimento a un'immagine grande sul Web, l'interfaccia utente non verrà bloccata. Invece, WPF scarica l'immagine in background e la mostra non appena il download è terminato. – Clemens