如何以编程方式获取Visual Studio使用的内置文件类型图标

时间:2018-08-02 13:09:14

标签: visual-studio-extensions vsix

我正在处理一个VSIX项目,该项目要求在“自定义工具”窗口中显示所选文件的(在“解决方案资源管理器”中)文件类型图标。有人可以建议我如何以编程方式获取Visual Studio IDE使用的文件类型图标吗?

例如获取PNG文件的以下图像图标(突出显示)  enter image description here

许多堆栈溢出中提到的

Icon.ExtractAssociatedIcon(*path*)解决方案  线程对我不起作用,因为它提供了Shell图标。

谢谢。

1 个答案:

答案 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...
}