【问题标题】:Loading image asynchronously in WPF using binding converter使用绑定转换器在 WPF 中异步加载图像
【发布时间】:2014-05-29 07:00:21
【问题描述】:

我有一个具有如下绑定设置的图像控件:

<Image Stretch="Uniform" Source="{Binding Path=CurrentItem, Converter={StaticResource ImgConverter}, IsAsync=True}"/>

ImgConverter 是:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string uri = null;

            Compressor.Unzip((value as Zipfile));

            uri = string.Format("{0}{1}.jpg", Compressor.TempPath, value.ToString());

            return uri;

        }

Compressor.Unzip(...) 方法确实需要一些时间。我设置了绑定IsAsync=True,但它不起作用(不在转换器上,但只在路径上?)。如何异步处理?

【问题讨论】:

  • 冻结片刻直到加载完毕。
  • 不幸的是,Binding.IsAsync 属性只影响属性获取器,而不影响绑定转换器。所以你可以考虑用一个额外的视图模型属性替换转换器,比如CurrentImage,你可以在没有转换器的情况下异步绑定。
  • @Clemens 有样品吗?我不熟悉MVVM。谢谢
  • 只需将另一个属性添加到定义CurrentItem 的类。
  • @Clemens 我使用了IsSynchronizedWithCurrentItem,所以CurrentItem不是我自己定义的。

标签: c# wpf asynchronous binding converter


【解决方案1】:

将只读的Image 属性添加到您的 Zipfile 类,并将转换器代码移动到属性 getter:

public class Zipfile
{
    ...

    public ImageSource Image
    {
        get
        {
            Compressor.Unzip(this);
            var uri = string.Format("{0}{1}.jpg", Compressor.TempPath, this.ToString());
            return new BitmapImage(new Uri(uri));
        }
    }
}

然后像这样编写你的绑定:

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

【讨论】:

  • 谢谢。虽然遇到了一些线程问题,但无论如何都是最好的解决方案。
  • @SeanC。你是如何解决你的线程问题的?我的图片从不显示
  • @Julien 就像他说的那样,在吸气剂中发挥作用。转换器不会异步工作。如果这对您不起作用,请检查您的图像源是否已被触发。
【解决方案2】:

使用 Multibinding 和两个绑定,第一个是自我图像控制,第二个是您当前的绑定,在转换器中您可以调用异步方法来解压缩文件,在回调中您可以设置图像路径(参考到第一次绑定); 你也可以看到这个示例:

http://social.msdn.microsoft.com/Forums/en-US/7fc238ea-194e-4f29-bcbd-9a3d4bdb2180/async-loading-of-bitmapsource-in-value-converter?forum=wpf

【讨论】:

  • 看来这个解决方案是更改转换器中的源属性。源属性已绑定。这会扭曲绑定设置吗?
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多