【问题标题】:Asynchronous Thumbnail Converter异步缩略图转换器
【发布时间】:2015-08-12 12:13:15
【问题描述】:

我遇到了 WPF 的缩略图创建问题。虽然我可以在不同的线程中创建缩略图和图像,但我无法将其传输到主 UI 线程。

已经处理了缩略图的转换,所以这不再是问题;这就是我现在的做法:

public ImageSource Image
{
    get
    {
      BitmapImage bi = new BitmapImage();

      bi.BeginInit();
      bi.DecodePixelWidth = 100;
      bi.CacheOption = BitmapCacheOption.OnLoad;
      bi.UriSource = new Uri(value.ToString());
      bi.EndInit();

      return bi;
    }
}

<Image Source="{Binding Image, IsAsync=True}"/>

 
我如何设法将缩略图传递给主线程?
提前非常感谢!

【问题讨论】:

  • 我也强烈建议不要在 Image 属性 getter 中创建 BitmapImage。绑定基础结构可能会多次访问该属性,这将在每次调用时创建一个新的 BitmapImage。
  • 我之前在转换中尝试过,但它不会异步工作。您对如何解决这个问题有什么建议吗?
  • 哪个“转换”?您的代码显示一个只读属性。在 BitmapImage 上调用 Freeze() 将使其可以跨线程访问。
  • 我的第一个想法是: 并创建缩略图 im Converter。
  • 请不要在 cmets 中发布代码。编辑您的问题,或提出其他问题。除此之外,绑定转换器被同步调用,即使绑定设置为异步。只有属性 getter 被异步调用。

标签: c# wpf


【解决方案1】:

为了使 BitmapImage 可以跨线程访问,您必须冻结它。您还应该保留创建的 BitmapImage,以防 getter 被多次调用。

private BitmapImage image;

public ImageSource Image
{
    get
    {
        if (image == null)
        {
            image = new BitmapImage();
            image.BeginInit();
            image.DecodePixelWidth = 100;
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = new Uri(value.ToString());
            image.EndInit();
            image.Freeze(); // here
        }
        return image;
    }
}

【讨论】:

  • 谢谢克莱门斯,它的工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 2015-05-30
  • 1970-01-01
  • 2011-09-07
  • 2013-03-01
  • 2015-04-21
  • 2015-11-17
相关资源
最近更新 更多