2

我正在尝试在XML 文件中保存和加载ImageSource(或)。BitmapSource快速浏览一下 SO 给了我这个答案

它看起来不错,所以我尝试了一下,但我得到了一个奇怪的结果。

当我尝试这段代码时,一切正常:

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
BackgroundImage = testImgSrc;

但是当我尝试这段代码时,图像根本就没有出现:

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png")));
string testImgStr = ImageToBase64(testImgSrc);
BitmapSource testImg = Base64ToImage(testImgStr);
BackgroundImage = testImg;

似乎没有任何错误或异常。当单步执行代码时BackgroundImage,它看起来被设置为一个有效的图像对象。

我的 WPF 表单有一个图像控件,它的源绑定到返回属性结果的BackgroundImage属性。我猜绑定工作正常,因为第一个测试按预期工作。

谁能帮我理解为什么第二个测试没有显示我的图像?

4

1 回答 1

5

这个答案Base64ToImage的方法有问题。文档指出,使用默认缓存选项,在实际使用图像之前不得关闭流。在您的情况下,这意味着该元素正在尝试访问已释放的流。OnDemandImage

修复非常简单,您只需将缓存选项更改为OnLoad,问题就消失了:

BitmapSource Base64ToImage(string base64)
{
    byte[] bytes = Convert.FromBase64String(base64);
    using (var stream = new MemoryStream(bytes))
    {
        return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    }
}
于 2012-11-16T20:56:26.253 回答