2012-10-27 49 views
2

我写了一个应用程序,它从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; 
} 

和我有三个问题:

  1. 有没有更好的解决方案,你可以建议?

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

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

+0

我尽量不使用的图像文件,你可以在资源字典中添加图像,然后使用DataTrigger来设置所需的图像资源。如果你认为你可以服务,放一些你的XAML代码,我们可以申请 – Mate

+0

感谢@Mate,我实际上是通过调用Icon.ExtractAssociatedIcon(path)来获取图标。所以我不能宣布他们在前面。 –

回答

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); 
+0

谢谢@Heliac,我实际上通过调用Icon.ExtractAssociatedIcon(路径)获取图标;所以我不能宣布他们在前面。 –