我正在处理一个VSIX项目,该项目要求在“自定义工具”窗口中显示所选文件的(在“解决方案资源管理器”中)文件类型图标。有人可以建议我如何以编程方式获取Visual Studio IDE使用的文件类型图标吗?
许多堆栈溢出中提到的 Icon.ExtractAssociatedIcon(*path*)
解决方案
线程对我不起作用,因为它提供了Shell图标。
谢谢。
答案 0 :(得分:1)
您应该使用Visual Studio Image Service and Catalog。但是,该文档没有说明如何获取给定文件的图像。
您必须使用IVsImageService2.GetImageMonikerForFile Method。如文档中所述,您可以获取GDI / Winforms,Win32或WPF图像。这是为WPF的BitmapSource执行的示例代码:
public static async Task<BitmapSource> GetWpfImageForFileAsync(AsyncPackage package, string filename, int width, int height)
{
if (package == null)
throw new ArgumentNullException(nameof(package));
var svc = (IVsImageService2)await package.GetServiceAsync(typeof(SVsImageService));
if (svc == null)
return null;
var mk = svc.GetImageMonikerForFile(filename);
var atts = new ImageAttributes
{
StructSize = Marshal.SizeOf(typeof(ImageAttributes)),
Format = (uint)_UIDataFormat.DF_WPF,
LogicalHeight = width,
LogicalWidth = height,
Flags = (uint)_ImageAttributesFlags.IAF_RequiredFlags,
ImageType = (uint)_UIImageType.IT_Bitmap
};
var obj = svc.GetImage(mk, atts);
if (obj == null)
return null;
obj.get_Data(out object data);
return (BitmapSource)data;
}
这里是如何在程序包初始化时使用它的方法:
public static async Task InitializeAsync(AsyncPackage package)
{
ThreadHelper.ThrowIfNotOnUIThread();
// note a valid extension is sufficient
_pngBitmap = await GetWpfImageForFileAsync(package, "whatever.png", 32, 32);
// etc...
}