我编写了一个应用程序,它从操作系统获取文件图标并绑定到它们,但由于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;
}
我有三个问题:
你能提出更好的解决方案吗?
最终关闭所使用的MemoryStream
的最佳方法是什么,因为此处的代码由绑定系统自动调用? (它们从不手动实例化,因为您可能会注意到我将流添加到集合中,我在析构函数中将它们调用Close()
,但我认为这不是一个很好的解决方案。)
与上一个问题相关,当我尝试在函数结束前关闭流时,即使我在此之前调用Stream.Flush(),图像也会显示为空。这是为什么?
答案 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);