2017-12-13 24 views
0

문서를 자동으로 인쇄하기 위해 C# WPF로 작성된 프로그램이 있습니다. 그것이 가지고있는 기능 중 하나는 이미지 다운로드 실패를 감지하여 빈 이미지가있는 문서가 인쇄되지 않도록 할 수 있다는 것입니다. _senderLogoFrame.DownloadFailed에서 이벤트 핸들러 BitmapFrameDownloadFailed 호출하면예외 : BitmapFrameDecode에서 IsFrozen을 false로 설정하여 수정해야합니다.

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

이 예외가 발생한다 :

'은 송신기 로고'이미지 다운로드 실패를 검출하는 코드의 한 부분 shippingLabelForm.CreateDocument 예외 : 수정하려면 'System.Windows.Media.Imaging.BitmapFrameDecode'형식의 지정된 값에 IsFrozen을 false로 설정해야합니다. 스택 추적 : InvoicePrintingClient.Form.ShippingLabelForm.SetDataToElements에서 System.Windows.Media.Imaging.BitmapSource.add_DownloadFailed (EventHandler`1 값) 에서 System.Windows.Freezable.WritePreamble() 에서 () InvoicePrintingClient.Form에서 .ShippingLabelForm.d__18.MoveNext() --- 예외가 throw 된 이전 위치에서 스택 추적 끝 --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (작업 작업) at System.Runtime.CompilerServices.TaskAwaiter .HandleNonSuccessAndDebuggerNotification (작업 작업) (InvoicePrintingClient.Main.PrintClientMainWindow). <> c__DisplayClass101_1. < b__4> d.MoveNext()

IsFrozen을 false로 설정한다는 것은 무엇을 의미합니까? BitmapSource.DownloadFailure 이벤트 핸들러와 관련이 있습니까? 이 문제를 해결하려면 무엇을해야합니까?

+0

['BitmapFrameDecode' (HTTP : // referencesource Microsoft Windows/PresentationCore/Core/CSharp/System/Windows/Media/Imaging/BitmapFrameDecode.cs)는 [BitmapFrame] (https://msdn.microsoft.com/en-us)에서 상속받은 내부 Microsoft 유형입니다. /library/system.windows.media.imaging.bitmapframe(v=vs.110).aspx). 후자는 여기에 문서로 IsFrozen 속성을 상속합니다 : ['Freezable.IsFrozen'] (https://msdn.microsoft.com/en-us/library/system.windows.freezable.isfrozen (v = vs.110) .aspx). – dbc

+0

@dbc "IsFrozen 속성이 true 일 때 개체를 수정하려고하면 InvalidOperationException이 발생합니다." 코드는 객체 수정과 관련이 없으며 이벤트 처리기를 할당하고 설정하기 만하면됩니다. –

답변

0

Stream 또는 로컬 파일 Uri를 매개 변수로 사용하여 BitmapFrame.Create을 호출하면 (즉, 비트 맵을 즉시 디코딩 할 수 있음) 메서드는 고정 된 BitmapFrame을 반환합니다. MSDN에서

는 :

모든 BitmapFrame은 항상 고정 된 디코더에서 돌아왔다. 수정 가능한 복사본이 필요한 경우에는 먼저 Clone 메서드를 사용하여 BitmapFrame의 복사본을 만들어야합니다.

예를 들어 DownloadFailed 이벤트에 대한 처리기를 연결하여 BitmapFrame을 수정할 수 없습니다.

이벤트 처리기를 연결하기 전에 IsFrozenIsDownloading 속성을 확인하기 만하면됩니다. IsDownloading이 false 인 경우 DownloadFailed 이벤트 핸들러를 연결하는 것이 아무 의미가 없습니다.

잠재적으로 유효하지 않거나 존재하지 않는 이미지 파일의 로컬 파일 열린 포인트하는 try/catch 블록의 BitmapFrame.Create 호 넣으면 검사 용
_senderLogoFrame = BitmapFrame.Create(new Uri(_invoice.Sender.Logo)); 

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

SenderLogo.Source = _senderLogoFrame; 

,