0

我有一个包含ListViewa作为它的。一列显示来自包含路径的绑定属性的图像。有多个条目具有相同的图像路径。现在我正在尝试替换一个图像文件并为所有关联条目重新加载显示的图像。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

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

4

1 回答 1

0

我已经在另一个问题中发布了这个,但不知道链接它是否更好,其他人也可能有更好的想法。顺便说一句,我正在绑定图像路径。


这是我在项目中最终得到的结果(我不得不说,测试似乎几乎可以工作的不同事物需要很长时间)。你可以看到注释代码也不能工作 100% 不记得为什么)

所以我所有以“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();
    }
}
于 2015-10-30T05:36:18.667 回答