空白 - 如果图像源是绝对Uri,则WPF中的黑色图像控制

时间:2011-02-04 09:42:38

标签: wpf image uri absolute

我在listbox控件上使用自己的datatemplate。列表框项目包含一个图像控件和一些文本块。

在图像源上我绑定了Uri的属性类型(绝对网址 - 例如:http://u.aimg.sk/fotky/1730/71/17307141.jpg?v=2

列表框有大约50-300个项目。

如果我测试应用程序,我有时会看到空白 - 白色或黑色图像而不是用户图像。

您可以在此图片上看到问题:

enter image description here enter image description here

我想知道导致此问题的原因以及如何解决此问题。 图像来源很好,我在浏览器中查看。

感谢您的建议。

1 个答案:

答案 0 :(得分:3)

我认为正在发生的事情是竞争条件。当您要求它们显示时,您的某些图像尚未完成下载。这里给出了一个很好的例子http://social.msdn.microsoft.com/Forums/en/wpf/thread/dc4d6aa9-299f-4ee8-8cd4-27a21ccfc4d0,我将总结一下:

private ImageSource _Src;

public ImageSource Src
{
  get { return _Src; }
  set 
  {
    _Src = value;
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs("Src"));
    ((BitmapImage)_Src).DownloadCompleted += new EventHandler(MainWindow_DownloadCompleted);
  }
}

void MainWindow_DownloadCompleted(object sender, EventArgs e)
{
  PropertyChanged(this, new PropertyChangedEventArgs("Src"));
  ((BitmapImage)_Src).DownloadCompleted -= MainWindow_DownloadCompleted;
}

使用上面的代码,当首次分配值时以及图像下载100%后,将告知绑定到您的属性的图像使用PropertyChanged调用进行更新。这是在上面的示例中使用的DownloadCompleted事件处理程序中处理的。这应该使它们不再显示为黑色图像,而是作为完全准备好的自我。

此外,如果您使用流作为图像的源,则需要确保使用BitmapCacheOption.OnLoad。如:

BitmapImage source = new BitmapImage();
source.BeginInit();
source.CacheOption = BitmapCacheOption.OnLoad;
source.StreamSource = yourStream;
source.EndInit();

这是因为默认情况下使用源的图像会延迟加载它,然后您的流可能会关闭,这也可能是您获得空白/黑色图像的原因。

祝你好运。