首页 > 解决方案 > 如何在 ISuggestedAction 中使用来自 .imagemanifest 的 ImageMoniker

问题描述

我希望能够在我的灯泡操作列表中为每个操作包含一个自定义图标,而不是简单的文本,以便它是一个图标和文本(见下文)。

在此处输入图像描述

我在 VSIX 中包含了 .imagemanifest 以及 png。下面是我的 foo.imagemanifest 的样子以及我的ISuggestedAction实现的一个片段。首先,这可能吗?如果是这样,是否还需要做其他事情才能看到灯泡动作中的图像?它是否必须以某种方式在图像目录/服务中注册,或者可能使用IVsImageService2.GetImageMonikerForFile(String)

我的foo.imagemanifest

<?xml version="1.0" encoding="utf-8"?>
<!-- This file was generated by the ManifestFromResources tool.-->
<!-- Version: 14.0.50929.2 -->
<ImageManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014">
  <Symbols>
    <String Name="Resources" Value="/MyCompany.VisualStudio;Component/Resources/Lightbulb" />
    <Guid Name="MonikersGuid" Value="{2a63e4c2-d4a6-5d82-aeb2-84935e052cd3}" />
    <ID Name="bug" Value="0" />
  </Symbols>
  <Images>
    <Image Guid="$(MonikersGuid)" ID="$(bug)">
      <Source Uri="$(Resources)/bug.png">
        <Size Value="16" />
      </Source>
    </Image>
  </Images>
  <ImageLists />
</ImageManifest>

ISuggestedAction实现包含:

public ImageMoniker IconMoniker => 
new ImageMoniker {Guid = new Guid("2a63e4c2-d4a6-5d82-aeb2-84935e052cd3"), Id = 0};

标签: c#visual-studiovisual-studio-2017visual-studio-extensionsvisual-studio-2019

解决方案


我在创建自定义绰号时也遇到了问题。
然后我在VSSDK github repo上找到了一个例子。
Menu_And_Commands示例展示了它的工作原理。

这里有几点需要考虑:

  • imagemanifest 文件应位于 vsix 文件中。

    • 属性:包含在 VSIX 中 = true

    如果您在调试模式下运行扩展程序,请确保 imagemanifest 文件也在 AppData Extension 文件夹中 --> C:\Users\{user}\AppData\Local\Microsoft\VisualStudio\15.0_1234abcdExp\Extensions\{author}\ {产品名称}\{版本}

  • imagemanifest 文件应直接放置在您的 c# 项目中。
    如果将它放在项目文件夹中的某个位置,它将无法工作。

  • png 文件应作为资源添加。

    • 属性:构建操作 = 资源

    确保图像确实在您的 dll 中并且路径正确。
    如果您不确定,请重建您的 vsix 项目。

我不知道它是否有必要,但对我来说,它只有在我为 imagemanifest 文件创建一个带有 VSIX 包的单独 VSIX 项目时才有效。如果安装了此 VSIX 包,则 Visual Studio 将知道名字对象的 GUID,其他 VSIX 包将找到它。

这个 imagemanifest 文件对我有用:

<?xml version="1.0" encoding="utf-8"?>
<ImageManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
               xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
               xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014">
    <Symbols>
        <String Name="Resources" Value="/MY.ASSEMBLY.NAME;Component/Resources" />
        <Guid Name="guidMyMoniker" Value="{08EF3AF1-7D26-4652-8923-6593CFE5392B}" />
        <ID Name="idImage1" Value="1" />
        <ID Name="idImage2" Value="2" />
    </Symbols>
    <Images>
        <Image Guid="$(guidMyMoniker)" ID="$(idImage1)">
            <Source Uri="$(Resources)/16x16/Image1_16pxl.png">
                <Size Value="16" />
            </Source>
            <Source Uri="$(Resources)/32x32/Image1_32pxl.png">
                <Size Value="32" />
            </Source>
        </Image>
        <Image Guid="$(guidMyMoniker)" ID="$(idImage2)">
            <Source Uri="$(Resources)/16x16/Image2_16pxl.png">
                <Size Value="16" />
            </Source>
            <Source Uri="$(Resources)/32x32/Image2_32pxl.png">
                <Size Value="32" />
            </Source>
        </Image>
    </Images>
    <ImageLists />
</ImageManifest>

推荐阅读