我的wpf应用程序中有一个按钮和一个名为image1的图像.我想从位置或文件路径的文件图标添加image1的图像源.这是我的代码:
using System.Windows; using System.Windows.Media.Imaging; using System.IO; using System.Drawing; namespace WpfApplication2 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } private void Button_Click_1(object sender, RoutedEventArgs e) { Icon ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe"); image1.Source = ico.ToBitmap(); } } }
错误在于说
无法将类型'System.Drawing.Bitmap'隐式转换为'System.Windows.Media.ImageSource'
如何解决这个问题呢?
您得到的错误是因为您尝试将位图指定为图像的来源.要纠正这个问题,请使用此功能:
BitmapImage BitmapToImageSource(Bitmap bitmap) { using (MemoryStream memory = new MemoryStream()) { bitmap.Save(memory, System.Drawing.Imaging.ImageFormat.Bmp); memory.Position = 0; BitmapImage bitmapimage = new BitmapImage(); bitmapimage.BeginInit(); bitmapimage.StreamSource = memory; bitmapimage.CacheOption = BitmapCacheOption.OnLoad; bitmapimage.EndInit(); return bitmapimage; } }
像这样:
image1.Source = BitmapToImageSource(ico.ToBitmap());
Farhan Anam建议的解决方案可行,但并不理想:图标从文件加载,转换为位图,保存到流中并从流中重新加载.那是非常低效的.
另一种方法是使用System.Windows.Interop.Imaging
类及其CreateBitmapSourceFromHIcon
方法:
private ImageSource IconToImageSource(System.Drawing.Icon icon) { return Imaging.CreateBitmapSourceFromHIcon( icon.Handle, new Int32Rect(0, 0, icon.Width, icon.Height), BitmapSizeOptions.FromEmptyOptions()); } private void Button_Click_1(object sender, RoutedEventArgs e) { using (var ico = System.Drawing.Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe")) { image1.Source = IconToImageSource(ico); } }
请注意在using
转换后处理原始图标的块.不这样做会导致手柄泄漏.