将图标运行时转换为ImageSource

时间:2012-10-27 22:13:17

标签: c# wpf

我编写了一个应用程序,它从操作系统获取文件图标并绑定到它们,但由于System.Drawing.Icon对象不能在ImageSource控件中用作Image,我不得不写一个converter

在搜索了一下后,我得到了以下代码,我现在正在使用该代码:

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;
}

我有三个问题:

  1. 你能提出更好的解决方案吗?

  2. 最终关闭所使用的MemoryStream的最佳方法是什么,因为此处的代码由绑定系统自动调用? (它们从不手动实例化,因为您可能会注意到我将流添加到集合中,我在析构函数中将它们调用Close(),但我认为这不是一个很好的解决方案。)

    < / LI>
  3. 与上一个问题相关,当我尝试在函数结束前关闭流时,即使我在此之前调用Stream.Flush(),图像也会显示为空。这是为什么?

1 个答案:

答案 0 :(得分: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);