イメージを正しく読み込もうとしています。一般的なエラー(つまり、フォーマットが不適切なファイル)に対して今すぐテストしています。これは現在、私が物事をテストするために使用する単純な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で示したように:
テスト "のすべて" のイベントには思われるだけ「ちゃんイベントを捕まえるためのコードは明らかに正しい) - 残りのイベントは決して発動しません。 - どうしてこれなの?
うーん、これはうまくいきますが、問題を「回避」しているように見えます。ハードドライブからの読み取りが他のものと比較して「遅い」ことを知っているからです。 - ロード中にUIにコントロールを戻すことは、最終的に行く方法です。 – paul23
ローカルファイルからBitmapImageをロードすることは常に同期していることに注意してください。 'IsDownloading'プロパティは' false'を返します。 'DownloadProgress'、' DownloadCompleted'、 'DownloadFailed'のいずれのイベントも起動されません。明らかに 'DecodeFailed'も発動しません。 – Clemens