2017-02-17 9 views
0

Я пытаюсь правильно загрузить изображение: прямо сейчас тестирую обычные ошибки (т. Е. Файл, который плохо отформатирован). В настоящее время это просто приложение wpf, которое я использую для проверки.Изображение 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 метод никогда не вызывается (ни одна строка не печатается и не визуальная студия вызвать точки останова я поставил там). Я делаю что-то неправильно"? Я считаю, что следил за учебником, предоставленным msdn?

EDIT: Чтобы исключить все возможные другие ошибки, я добавил выше «isdownloading» проверить

Console.WriteLine(System.IO.File.Exists(uri.OriginalString)); 
  • , который показывает «True» Я также добавил лямбда в качестве слушателя - как показано this page.

EDIT 2:

Testing "все" события, кажется, что только «чан ged "(так что код, чтобы поймать события, по-видимому, правильный) - остальные события никогда не срабатывают. - Почему это?

ответ

0

Вы можете просто установить BitmapCacheOption.OnLoad сделать WPF немедленно загрузить файл изображения, и получить исключение, если оно не может быть расшифрован:

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

Хм это работает, но, похоже, «обойти» проблему: как мы все знаем, чтение с жесткого диска является «медленным» по сравнению с чем-либо еще. - Таким образом, отдавая контроль над пользовательским интерфейсом во время загрузки, в конечном счете, это путь. – paul23

+0

Помните, что загрузка BitmapImage из локального файла всегда синхронна. Свойство 'IsDownloading' возвращает' false'. Ни один из событий 'DownloadProgress',' DownloadCompleted' или 'DownloadFailed' не будет запущен. По-видимому, также 'DecodeFailed' не запускается. – Clemens

0

DownloadFailed как указано в названии, будет выполнен только в том случае, если изображение не может быть загружено, и, поскольку вы указываете его в комментариях, он существует, но это не изображение.

Если вы хотите обнаружить ошибку в скачиваемом файле, используйте событие DecodeFailed.

+0

ой спасибо, но до сих пор не решить. изменение конструктора обработчиков событий, чтобы иметь 'Img.DecodeFailed + = новый EventHandler (ImageLoadFailed);' все еще не запускает его? – paul23