0

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}}"/>
4

1 に答える 1

0

理解した:

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 を更新できます。

于 2011-11-03T22:17:59.253 に答える