例外:BitmapFrameDecode必须将IsFrozen设置为false才能修改

时间:2017-12-13 03:24:09

标签: c# wpf exception bitmapsource bitmapframe

我有一个用C#WPF编写的程序可以自动打印文档。它的一个功能是它可以检测图像下载失败,因此具有该空图像的文档不会被打印。

这是检测“发件人徽标”下载失败的代码的一部分。图像:

_senderLogoFrame = BitmapFrame.Create(new Uri(_invoice.Sender.Logo));
_senderLogoFrame.DownloadFailed += BitmapFrameDownloadFailed;
SenderLogo.Source = _senderLogoFrame;

当调用来自BitmapFrameDownloadFailed的事件处理程序_senderLogoFrame.DownloadFailed时,会发生此异常:

  

shippingLabelForm.CreateDocument例外:类型' System.Windows.Media.Imaging.BitmapFrameDecode'的指定值必须将IsFrozen设置为false才能修改。       堆栈跟踪:       在System.Windows.Freezable.WritePreamble()       在System.Windows.Media.Imaging.BitmapSource.add_DownloadFailed(EventHandler`1 value)       at InvoicePrintingClient.Form.ShippingLabelForm.SetDataToElements()       at InvoicePrintingClient.Form.ShippingLabelForm.d__18.MoveNext()       ---从抛出异常的先前位置开始的堆栈跟踪结束---       在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)       在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)       在InvoicePrintingClient.Main.PrintClientMainWindow。<> c__DisplayClass101_1。< b__4> d.MoveNext()

IsFrozen设为false是什么意思?它与BitmapSource.DownloadFailure事件处理程序有什么关系吗?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

当您使用Stream或本地文件Uri作为参数调用BitmapFrame.Create时(因此它可以立即解码位图),该方法将返回一个冻结的BitmapFrame。

来自MSDN

  

从解码器返回的任何BitmapFrame始终都是冻结的。如果需要可修改的副本,则必须首先使用克隆方法创建BitmapFrame的副本。

因此,您无法修改BitmapFrame,例如为DownloadFailed事件附加处理程序。

在附加事件处理程序之前,只需检查IsFrozenIsDownloading属性即可。如果IsDownloading为假,则附加DownloadFailed事件处理程序是没有意义的。

_senderLogoFrame = BitmapFrame.Create(new Uri(_invoice.Sender.Logo));

if (!_senderLogoFrame.IsFrozen && _senderLogoFrame.IsDownloading)
{
    _senderLogoFrame.DownloadFailed += BitmapFrameDownloadFailed;
}

SenderLogo.Source = _senderLogoFrame;

要检查本地文件Uri是否指向可能无效或不存在的图像文件,请将BitmapFrame.Create调用放入try/catch块,