Исключение: для 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 блок,

Другие вопросы по тегам