我想加载Gravatar-Images并将它们从后面的代码设置为WPF图像控件。 因此,代码看起来像使WPF图像加载异步
imgGravatar.Source = GetGravatarImage(email);
凡GetGravatarImage样子:
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也有[与URI参数的构造函数(http://msdn.microsoft.com/en-us/library/ms602473.aspx),这将节省您的BeginInit在/ EndInit调用。 – Clemens
+1不知道,很好的提示。我只是复制了作者的代码,并没有考虑如何优化实际下载,而是专注于以优雅的方式解决UI块问题(当然,如果代码不是异步的,它会阻止)。我认为对于重复使用,转换器也可以从绑定中获得完整的url,使其更具可重用性,而不是电子邮件。我不喜欢使用'ThreadPool',因为你必须随时管理调度。这使得它对我来说不够纯粹的MVVM应用程序。 – JanW
你能否给出一个解释,为什么创建一个BitmapImage会在不被异步调用时阻塞。为什么然后它有'IsDownloading'属性和'DownloadCompleted'事件。如果您只是将XAML中的Image控件的“Source”属性设置为引用Web上大图像的URL,则UI将不会被阻止。相反,WPF会在后台下载图像,并在下载完成后立即显示。 – Clemens