2

で、 (SQL CE イメージ) をValueConverterに変換しようとしていました。この方法は機能します (画像はフォームに正しく表示されます):System.Data.Linq.BinaryBitmapImage

public object Convert(object value, Type targetType, object parameter, 
                                                     CultureInfo culture) {
    Binary binary = value as Binary;
    if (binary != null) {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.StreamSource = new MemoryStream(binary.ToArray());
        bitmap.EndInit();
        return bitmap;
    }
    return null;
}

このメソッドは機能しません(ただし、奇妙なことに、例外はスローされません)。

public object Convert(object value, Type targetType, object parameter, 
                                                     CultureInfo culture) {
    Binary binary = value as Binary;
    if (binary != null) {
        using (var stream = new MemoryStream(binary.ToArray())) {
            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.StreamSource = stream;
            bitmap.EndInit();
            return bitmap;
        }
    }
    return null;
}

優れたプログラミングの実践では、作成したストリームはすべて破棄する必要があると述べられています...そのため、2番目の方法が機能しないのに最初の方法は機能する理由がわかりません。洞察はありますか?

4

2 に答える 2

2

代わりにこれを試してください:

public object Convert(object value, Type targetType, object parameter, 
                                                     CultureInfo culture) {
    Binary binary = value as Binary;
    if (binary != null) {
        using (var stream = new MemoryStream(binary.ToArray())) {
            BitmapImage bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.CacheOption = BitmapCacheOption.OnLoad; 
            bitmap.StreamSource = stream;
            bitmap.EndInit();
            bitmap.Freeze(); 
            return bitmap;
        }
    }
    return null;
}

動作していないバージョンでは、ブロックは、画像が実際にデコードされる前にusingストリームが閉じられることを意味します。

于 2011-01-23T03:46:50.310 に答える
0

私の推測では、を破棄するときは、ビットマップのMemoryStreamを無効にしていると思います。StreamSourceしたがって、ビットマップがレンダリングしようとすると、使用可能な有効なデータがありません。

于 2011-01-23T03:47:19.430 に答える