在GridView中重新加载绑定的图像

时间:2015-10-29 05:29:05

标签: c# wpf gridview bitmapimage celltemplate

我的ListView包含一个GridViewObservableCollectionItemsSource。一列显示包含路径的绑定属性中的图像。有多个条目具有相同的图像路径。现在我正在尝试替换一个图像文件并为所有相关条目重新加载显示的图像。

到目前为止,这是我的单元格模板的样子(需要CacheOption,因此替换它时图像文件未被使用):

<GridViewColumn.CellTemplate>
  <DataTemplate>
    <Image RenderOptions.BitmapScalingMode="HighQuality">
      <Image.Source>
        <BitmapImage UriSource="{Binding Image}" CacheOption="OnLoad" />
      </Image.Source>
    </Image>
  </DataTemplate>
</GridViewColumn.CellTemplate>

重新加载图片的常用方法似乎是使用BitmapImage创建新的BitmapCreateOptions.IgnoreImageCache并将其分配给相应的Image.Source,替换旧的BitmapImage

显然,对于数百个ListView条目手动执行此操作并不是很实际。我想我可以刷新ItemsSource属性,如果我对我的单元格模板中的CreateOptions="IgnoreImageCache"使用BitmapImage,但我不确定副作用(例如,在使用相同效果时绕过缓存图像多次)。

重新加载这些图片的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我已经在另一个问题中发布了这个但不知道是否更好地链接它,其他人也可能会有更好的想法。顺便提一下,我对图像路径有约束力。

这是我在我的项目中得到的结果(我必须说它花了很长时间来测试看起来几乎有用的不同东西)。您可以看到注释的代码,它也无法正常工作100%不记得原因)

所以我的所有图片来自app资产,以“ms-appx:”开头,我使用设置源而不加载到流,因为这些从未改变(默认图像等)

用户创建或更改的其他图像我必须重新加载并设置源文件读取的结果(否则当它们被更改时有时它们没有更新)

所以基本上我几乎在所有使用可以改变的图像的地方使用这个转换器(不改变它们的名字)。

定义您的转换器:

<converters:ImageConverter x:Key="ImageConverter" /> 

然后像这样使用

<Image Source="{Binding PictureFilename, Converter={StaticResource ImageConverter}}"
       HorizontalAlignment="Center"
       VerticalAlignment="Center"/>

(另一种解决方法是以不同的方式命名您的图像,然后在更新源路径时它可以正常工作。)

public class ImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        try
        {
            var CapturedImage = new BitmapImage();
            CapturedImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            if (((string)value).StartsWith("ms-appx:"))
            {
                CapturedImage.UriSource = new Uri((string)value, UriKind.RelativeOrAbsolute);
                return CapturedImage;

            }
            var file = (StorageFile.GetFileFromPathAsync(new Uri((string)value, UriKind.RelativeOrAbsolute).LocalPath).AsTask().Result);
            using (IRandomAccessStream fileStream = file.OpenAsync(FileAccessMode.Read).AsTask().Result)
            {
                CapturedImage.SetSource(fileStream);
                return CapturedImage;

            }
        }
        catch (Exception e)
        {
            Logger.Error("Exception in the image converter!", e);
            return new BitmapImage();
        }

        //BitmapImage img = null;
        //if (value is string)
        //{
        //    img = new BitmapImage();
        //    img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        //    img.UriSource = new Uri((string)value, UriKind.RelativeOrAbsolute);
        //}

        //if (value is Uri)
        //{
        //    img = new BitmapImage();
        //    img.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        //    img = new BitmapImage((Uri)value);
        //}

        //return img;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}