我想加载 Gravatar-Images 并将它们从代码隐藏设置为 WPF Image-Control。
所以代码看起来像
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?
Thanks!
我建议您在 XAML 中的 imgGravatar 上使用 Binding。放IsAsync=true其上,WPF 将自动利用线程池中的线程来提取图像。您可以将解析逻辑封装到 IValueConverter 中,然后简单地将电子邮件绑定为源
in XAML:
<Window.Resouces>
<local:ImgConverter x:Key="imgConverter" />
</Window.Resource>
...
<Image x:Name="imgGravatar"
Source="{Binding Path=Email,
Converter={StaticResource imgConverter},
IsAsync=true}" />
in Code:
public class ImgConverter : IValueConverter
{
public override object Convert(object value, ...)
{
if (value != null)
{
BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.UriSource = new Uri(
GravatarImage.GetURL(
"http://www.gravatar.com/avatar.php?gravatar_id=" +
value.ToString()) , UriKind.Absolute
);
bi.EndInit();
return bi;
}
else
{
return null;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)