Привязать источник изображения к URI с помощью Error Image, если загрузка не удалась - PullRequest
0 голосов
/ 03 ноября 2011

Я работаю над привязкой URI к изображению, и у меня привязка работает просто отлично. Проблема в том, что изображения генерируются на лету, и генерация может выдать исключение. Я использую конвертер, но я не могу правильно прикрепить его к событию DecodeFailed, либо я пропустил что-то еще. Вот мой код:

Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
        Dim image As New System.Windows.Media.Imaging.BitmapImage()
        Try
            image = New System.Windows.Media.Imaging.BitmapImage(New Uri(CStr(value)))
            AddHandler image.DownloadFailed, AddressOf DecodeFailed
            AddHandler image.DecodeFailed, AddressOf DecodeFailed
        Catch
            Return Windows.DependencyProperty.UnsetValue
        End Try
        Return image
    End Function

    Private Sub DecodeFailed(ByVal sender As Object, ByVal e As System.Windows.Media.ExceptionEventArgs)
        Dim image As System.Windows.Media.Imaging.BitmapImage = DirectCast(sender, System.Windows.Media.Imaging.BitmapImage)
        image.UriSource = New Uri("C:\Users\myUser\Desktop\errorSign.jpg")
    End Sub

Ни DecodeFailed, ни DownloadFailed не запускаются, когда я выкидываю исключение из обработчика загрузки. Coverter определенно используется, и изображения отображаются.

...
<myNs:ImageConverter x:Key="ImageConverter"></myNs:ImageConverter>
...
<Image Height="125" Source="{Binding Path=Uri, Converter={StaticResource ImageConverter}}"/>

1 Ответ

0 голосов
/ 04 ноября 2011

Разобрался:

Public Shared Event DownloadOrDecodeFailed(ByVal oldUri As String, ByVal newUri As String)
Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
            Dim image As New System.Windows.Media.Imaging.BitmapImage()
            Try
                AddHandler image.DownloadFailed, AddressOf OnDownloadOrDecodeFailed
                AddHandler image.DecodeFailed, AddressOf OnDownloadOrDecodeFailed
                image.BeginInit()
                image.UriSource = DirectCast(value, Uri)
                image.EndInit()
            Catch
                Return Windows.DependencyProperty.UnsetValue
            End Try
            Return image
        End Function

        Private Shared Sub OnDownloadOrDecodeFailed(ByVal sender As Object, ByVal e As System.Windows.Media.ExceptionEventArgs)
            Dim image As System.Windows.Media.Imaging.BitmapImage = DirectCast(sender, System.Windows.Media.Imaging.BitmapImage)
            RaiseEvent DownloadOrDecodeFailed(image.UriSource.AbsolutePath, "C:\Users\myUser\Desktop\errorSign.jpg")
        End Sub

Поскольку событие является общим, я могу присоединиться к нему и обновить изображение URI из модели представления, если источник изображения, выдавший событие, совпадает.

...