我有一个用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
事件处理程序有什么关系吗?我该怎么做才能解决这个问题?
答案 0 :(得分:0)
当您使用Stream或本地文件Uri作为参数调用BitmapFrame.Create
时(因此它可以立即解码位图),该方法将返回一个冻结的BitmapFrame。
来自MSDN:
从解码器返回的任何BitmapFrame始终都是冻结的。如果需要可修改的副本,则必须首先使用克隆方法创建BitmapFrame的副本。
因此,您无法修改BitmapFrame,例如为DownloadFailed
事件附加处理程序。
在附加事件处理程序之前,只需检查IsFrozen
和IsDownloading
属性即可。如果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
块,