Исключение: для BitmapFrameDecode для IsFrozen должно быть установлено значение false, чтобы изменить
У меня есть программа, написанная на 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) в InvoicePrintingClient.Form.ShippingLabelForm.SetDataTo.ImpF.MoveNext() --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача TaskCr).Main.PrintClientMainWindow.<> c__DisplayClass101_1.
d.MoveNext ()
Что это значит, установив IsFrozen
ложно? Это как-то связано с BitmapSource.DownloadFailure
обработчик события? Что мне нужно сделать, чтобы решить эту проблему?
1 ответ
Когда вы звоните BitmapFrame.Create
с параметром Stream или локальным файлом Uri (и поэтому он может немедленно декодировать растровое изображение), метод возвращает замороженный BitmapFrame.
Из MSDN:
Любой BitmapFrame, возвращаемый из декодера, всегда заморожен. Если вам требуется изменяемая копия, сначала вы должны создать копию BitmapFrame с помощью метода Clone.
Таким образом, вы не можете изменить BitmapFrame, например, прикрепив обработчик для DownloadFailed
событие.
Перед подключением обработчика событий просто проверьте IsFrozen
а также IsDownloading
свойства. Присоединение обработчика события DownloadFailed в любом случае бессмысленно, если IsDownloading
ложно
_senderLogoFrame = BitmapFrame.Create(new Uri(_invoice.Sender.Logo));
if (!_senderLogoFrame.IsFrozen && _senderLogoFrame.IsDownloading)
{
_senderLogoFrame.DownloadFailed += BitmapFrameDownloadFailed;
}
SenderLogo.Source = _senderLogoFrame;
Для проверки, указывает ли локальный файл Uri на потенциально недействительный или несуществующий файл изображения, поместите BitmapFrame.Create
позвонить в try/catch
блок,