2

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 つの質問があります。

  1. あなたが提案できるより良い解決策はありますか?

  2. MemoryStreamここのコードはバインディング システムによって自動的に呼び出されるため、使用されている sを最終的に閉じる最良の方法は何ですか? (デストラクタでそれらを呼び出すコレクションにストリームを追加していることに気付くかもしれませんClose()が、それは良い解決策ではないと思います)。

  3. 前の質問に関連して、関数の終了前にストリームを閉じようとすると、その前にStream.Flush()を呼び出しても画像が空になります。どうしてこれなの?

4

1 に答える 1

0

最近、プロジェクト リソース (WindowIcon) のアイコンを Window.Icon ImageSource に割り当てようとすると、次のように成功しました。

using System.Drawing;
using System.Windows.Media;

...

Icon someIcon = Properties.Resources.WindowIcon;
Bitmap someBitmap = someIcon.ToBitmap();
this.Icon = (ImageSource)new ImageSourceConverter().ConvertFrom(someBitmap);
于 2013-08-22T10:14:01.347 に答える