Gravatar-Imagesを読み込み、コードビハインドからWPF Image-Controlに設定したいと思います。 だから、コードはGetGravatarImageがどのように見えるWPF画像を非同期にする
imgGravatar.Source = GetGravatarImage(email);
次のようになります。
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;
ネットワーク接続が遅い場合残念ながら、これはGUIをロックします。イメージソースを割り当て、UIをブロックすることなくバックグラウンドでイメージを読み込ませる方法はありますか?
ありがとうございます!
のBitmapImageはまた、あなたのBeginInitの/ EndInitコールを救う(http://msdn.microsoft.com/en-us/library/ms602473.aspx)[URIパラメータを持つコンストラクタ]を、持っています。 – Clemens
+1はそれについて知りませんでした、いいヒント。私はちょうど著者からのコードをコピーし、実際のダウンロードを最適化する方法については考えていませんでした。代わりに、UIブロックの問題を優雅な方法で解決することに焦点を当てました(もちろんコードが非同期でない場合はブロックします)。繰り返し使用すると、コンバーターは電子メールの代わりにバインディングから完全なURLを再利用できるようにすることもできます。あなたがディスパッチを常に管理しなければならないので、私は 'ThreadPool'を使って嫌いです。これは純粋なMVVMアプリケーションのために私には十分にエレガントではありません。 – JanW
BitmapImageを作成すると非同期に呼び出されないとブロックされる理由を説明できますか?それではなぜIsDownloadingプロパティと 'DownloadCompleted'イベントがありますか? XAMLのImageコントロールの 'Source'プロパティをWeb上の大きな画像を参照するURLに設定するだけでは、UIはブロックされません。代わりに、WPFはバックグラウンドでイメージをダウンロードし、ダウンロードが終了するとすぐにイメージを表示します。 – Clemens