如何释放Image.Source来更新WPF中的图像?

时间:2016-08-28 03:12:42

标签: wpf xaml

我想将Image.Source属性更新为相同的文件路径但已更新。我正在使用一种方法来设置Source属性。

方式:

    void setImageSource(string file)
    {
        BitmapImage image = new BitmapImage();
        image.BeginInit();
        Uri imageSource = new Uri(file);
        image.CacheOption = BitmapCacheOption.OnLoad;
        image.UriSource = imageSource;
        image.EndInit();

        ssPreview.Source = image;
    }

在第一组源中没有问题。但是当我第二次调用此方法时,它会在ssPreview.Source = image行引发错误。错误显示cannot access file because it is being used by another process

我无法解决这个问题。怎么解决?

1 个答案:

答案 0 :(得分:3)

当您尝试从中创建BitmapImage时,错误消息指示图像文件仍处于打开状态。这意味着您在更新后没有关闭它。

除此之外,从文件加载BitmapSource的更安全的方法是使用FileStream而不是Uri,如下所示。这绝对避免了WPF可能完成的任何图像URI缓存。

private static BitmapSource LoadImage(string path)
{
    var bitmap = new BitmapImage();

    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        bitmap.BeginInit();
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.StreamSource = stream;
        bitmap.EndInit();
    }

    return bitmap;
}

或更短:

private static BitmapSource LoadImage(string path)
{
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}