2017-02-17 9 views
0

イメージを正しく読み込もうとしています。一般的なエラー(つまり、フォーマットが不適切なファイル)に対して今すぐテストしています。これは現在、私が物事をテストするために使用する単純なwpfアプリケーションです。Image DecodeFailedイベントが起動しない?

public partial class MainWindow : Window 
{ 
    public MainWindow() { 
     var s = new BitmapImage(); 
     var uri = new Uri("test.txt", UriKind.RelativeOrAbsolute); //test exists but is obviously no image data 
     DownloadImageListener dl = new DownloadImageListener(s); 
     s.DecodeFailed += (sender, e) => 
     { 
      Console.WriteLine("event is performed as lambda"); 
     }; 
     s.BeginInit(); 
     s.UriSource = uri; 
     s.EndInit(); 
     Console.WriteLine(System.IO.File.Exists(uri.OriginalString)); //True! 
     Console.WriteLine(s.IsDownloading); //"False" - done loading! 
     Console.WriteLine(s.Width); //just to fail hard 
    } 
} 

class DownloadImageListener 
{ 
    private BitmapImage Img; 

    public DownloadImageListener(BitmapImage i) { 
     Img = i; 
     // Add "ListChanged" to the Changed event on "List". 
     Img.DecodeFailed += new EventHandler<ExceptionEventArgs>(ImageLoadFailed); 
    } 

    // This will be called whenever the list changes. 
    private void ImageLoadFailed(object sender, EventArgs e) { 
     Console.WriteLine("This is called when the loading failes"); 
    } 

    public void Detach() { 
     // Detach the event and delete the list 
     Img.DecodeFailed -= new EventHandler<ExceptionEventArgs>(ImageLoadFailed); 
     Img = null; 
    } 
} 

ImageLoadFailed方法は、(何行が印刷されていないもVisual Studioが、私はそこに置かれたブレークポイントをトリガん)と呼ばれることはありません。私は何か「間違っている」か? msdnで提供されているチュートリアルに従ったと思いますか?

EDIT: は、私がチェックし、「isdownloading」の上に追加した、すべての潜在的な他のエラーを排除するには 「真」私もリスナーとしてラムダを追加しまし示し

Console.WriteLine(System.IO.File.Exists(uri.OriginalString)); 

EDIT 2で示したように:

テスト "のすべて" のイベントには思われるだけ「ちゃんイベントを捕まえるためのコードは明らかに正しい) - 残りのイベントは決して発動しません。 - どうしてこれなの?

答えて

0

あなたは、単にWPFはすぐにイメージファイルをロードし、それを復号することができない場合に例外を取得するためにBitmapCacheOption.OnLoadを設定できます。おかげああ

var bitmap = new BitmapImage(); 
try 
{ 
    bitmap.BeginInit(); 
    bitmap.UriSource = new Uri("test.txt", UriKind.RelativeOrAbsolute); 
    bitmap.CacheOption = BitmapCacheOption.OnLoad; 
    bitmap.EndInit(); 
} 
catch (Exception ex) 
{ 
    Debug.WriteLine(ex.Message); 
} 
+0

うーん、これはうまくいきますが、問題を「回避」しているように見えます。ハードドライブからの読み取りが他のものと比較して「遅い」ことを知っているからです。 - ロード中にUIにコントロールを戻すことは、最終的に行く方法です。 – paul23

+0

ローカルファイルからBitmapImageをロードすることは常に同期していることに注意してください。 'IsDownloading'プロパティは' false'を返します。 'DownloadProgress'、' DownloadCompleted'、 'DownloadFailed'のいずれのイベントも起動されません。明らかに 'DecodeFailed'も発動しません。 – Clemens

0

DownloadFailed画像はダウンロードできない場合にのみ実行され、コメントに記載されているとおりに存在しますがイメージではありません。

ダウンロードしたファイルのエラーを検出する場合は、DecodeFailedイベントを使用してください。

+0

、まだそれを解決しないこと。イベントハンドラのコンストラクタを 'Img.DecodeFailed + = new EventHandler (ImageLoadFailed);に変更してもまだ起動しません。 – paul23

関連する問題