我写了一个应用程序,它从OS获取文件图标并绑定到它们,但由于System.Drawing.Icon对象不能在Image控件中用作ImageSource的控件,所以我不得不写一个converter。运行时将图标转换为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;
}
和我有三个问题:
有没有更好的解决方案,你可以建议?
什么是最终关闭所使用的
MemoryStream
的最佳方式,因为这里的代码是由绑定系统自动调用的? (他们从来没有手动实例化,因为您可能会注意到我正在将流添加到集合中,我在析构函数中将它们称为Close()
,但我认为这不是一个好的解决方案)。与上一个问题相关的是,当我在函数结束之前尝试关闭流时,即使我在此之前调用Stream.Flush(),图像也会显示为空。为什么是这样?
我尽量不使用的图像文件,你可以在资源字典中添加图像,然后使用DataTrigger来设置所需的图像资源。如果你认为你可以服务,放一些你的XAML代码,我们可以申请 – Mate
感谢@Mate,我实际上是通过调用Icon.ExtractAssociatedIcon(path)来获取图标。所以我不能宣布他们在前面。 –