4

過去に画像を表示したいときはいつでも、画像パスを画像のソース プロパティにバインドしていました。簡単すぎる。

ここで、画像を変更し、常に最新の変更を加えた画像表示したいと考えています。BitmapImage変更画像は、クラス内のプロパティに保存されます。BitmapImageそのため、イメージ コントロールにディスクからイメージをロードするように要求する代わりに、それを自分のプロパティに直接バインドしたいと考えました。しかし、画像は表示されません。

次に(テストのためだけに)値コンバーターを作成し、そこにある画像へのパスを使用して を作成し、BitmapImageそれをコントロールに返しました-画像が表示されます。

繰り返しBitmapImageますが、カバーター内のパスからの作成は機能します。BitmapImage同じコードを使用してクラスで作成されたプロパティにイメージ コントロールをバインドすると失敗します。

それは同じ問題を説明していますが、「解決策」は機能しません。(OPが同じコメントをしたので、なぜ解決済みとしてマークされているのだろうか)

https://stackoverflow.com//questions/7263509/directly-binding-a-bitmapimage-created-inside-a-class-bound-to-a-listbox-in-wpf

編集:ここにいくつかのコードがあります

これは、可視画像を正常に作成するコンバーターです。

public class BsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        BitmapImage bi = new BitmapImage(new Uri(value.ToString()));

        return bi;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

...そして、画像を表示する XAML バインディング。FileタイプFileInfoでありFullName、完全なパスを保持します。

<Image MinHeight="100" MinWidth="100" Source="{Binding SelectedImage.File.FullName, Converter={StaticResource BsConverter}}"/>

BitmapImage image { get; set; }クラスのコンストラクターで初期化するプロパティがあります。

image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(file.FullName);
image.CacheOption = BitmapCacheOption.OnLoad;
image.EndInit();

...そしてバインディング。しかし - 喜びはありません。画像が表示されません。

<Image MinHeight="100" MinWidth="100" Source="{Binding SelectedImage.image}"/>
4

2 に答える 2

4

プロパティはパブリックである必要があります。バインディングを更新するには、プロパティを定義するクラスがINotifyPropertyChangedインターフェイスを実装する必要があります。

public class SelectedImage : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private ImageSource image;

    public ImageSource Image
    {
        get { return image; }
        set
        {
            image = value;

            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Image"));
            }
        }
    }
}
于 2013-06-01T15:13:42.450 に答える
1

同じ問題に遭遇しました。画像のタイミングと非同期読み込みに関係しているようです。おそらく、コンバーター コードは Dispatcher で異なる優先度で実行されているため、動作が異なります。

私のプロジェクトでは、コードで BitmapImage を明示的にプリロードすることで、この動作を回避しました。

        Dim result As ScaleItImageSource = Nothing

    Dim stream As System.IO.FileStream = Nothing
    Try
        stream = New System.IO.FileStream(fileName, IO.FileMode.Open, IO.FileAccess.Read)
        Dim decoder As BitmapDecoder = System.Windows.Media.Imaging.BitmapDecoder.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad)
        If decoder.Frames.Count > 0 Then
            result = New ScaleItImageSource(decoder.Frames(0), fileName)
        End If
    Finally
        If stream IsNot Nothing Then
            stream.Close()
        End If
    End Try

    Return result
于 2013-06-01T13:37:07.103 に答える