使用绑定转换器在WPF中异步加载图像

时间:2014-04-15 04:58:26

标签: c# wpf asynchronous binding converter

我有一个像这样的绑定设置的Image控件:

<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,但它不起作用(不在转换器上但只在路径上?)。我该如何异步处理?

2 个答案:

答案 0 :(得分: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}"/>

答案 1 :(得分:0)

使用带有两个绑定的多重绑定,首先是自我图像控制,第二个是你当前的绑定,在转换器中你可以调用async你的方法来解压缩文件,在回调中你可以设置图像路径(参考第一次约束); 你也可以看到这个样本:

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