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

本文关键字:异步 加载 映像 WPF 绑定 转换器 | 更新日期: 2023-09-27 17:58:24

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

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

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

将只读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}"/>

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

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