2017-12-13 20 views
0

C#WPFで文書を自動的に印刷するプログラムがあります。それが持つ機能の1つは、イメージのダウンロードの失敗を検出できるため、その空のイメージを持つドキュメントが印刷されないことです。 _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() ---例外がスローされた前の場所からのスタックトレースの末尾---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 Corporation、その関連会社及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、逸失利益、懲罰的損害、 /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

BitmapFrame.CreateをストリームまたはローカルファイルUriをパラメータとして呼び出すと、すぐにビットマップをデコードすることができるため、フリーズされた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; 

関連する問題