OS からファイル アイコンを取得してバインドするアプリケーションを作成しましたが、System.Drawing.IconオブジェクトはImageコントロールでImageSourceとして使用できないため、コンバーターを作成する必要がありました。
少し検索した後、現在使用している次のコードにたどり着きました。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
Icon ico = (value as Icon);
Bitmap bits = ico.ToBitmap();
MemoryStream strm = new MemoryStream();
// add the stream to the image streams collection so we can get rid of it later
_imageStreams.Add(strm);
bits.Save(strm, System.Drawing.Imaging.ImageFormat.Png);
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = strm;
bitmap.EndInit();
// freeze it here for performance
bitmap.Freeze();
return bitmap;
}
3 つの質問があります。
あなたが提案できるより良い解決策はありますか?
MemoryStream
ここのコードはバインディング システムによって自動的に呼び出されるため、使用されている sを最終的に閉じる最良の方法は何ですか? (デストラクタでそれらを呼び出すコレクションにストリームを追加していることに気付くかもしれませんClose()
が、それは良い解決策ではないと思います)。前の質問に関連して、関数の終了前にストリームを閉じようとすると、その前にStream.Flush()を呼び出しても画像が空になります。どうしてこれなの?