特定文件的Visual Studio自定义编辑器

问题描述 投票:1回答:1

语境:

我正在为visual studio 2017创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“manifest.json”的文件。

我需要为“manifest.json”文件创建自定义编辑器\ designer,当用户在“解决方案资源管理器”中双击该文件时,它会打开我的自定义编辑器。

我已经在Microsoft Doc上找到了一些文章(比如这个Create custom editors and designers),并发现了一些关于创建自定义编辑器和自定义设计器的GitHub示例(如Editor_With_ToolboxSingleFileGeneratorWPFDesigner_XMLSnippet Designer)。

问题:

  • 大多数文章,示例和文档解释了如何将自定义编辑器与特定文件扩展名相关联(在我的情况下,我想将编辑器与特定项目中的特定文件“manifest.json”相关联)。
  • 与单文件生成器相关的文章,它们不适合我的解决方案,因为它们讲的是在设计器中编辑文件而另一个文件在解决方案中发出(如windows窗体设计器)。

摘要:

我想实现只为我的自定义项目模板中的特定文件运行的visual studio自定义编辑器\设计器。怎么做到这一点?

笔记:

  • 必须将自定义编辑器中要关联的文件命名为“manifest.json”。
  • 如果在其他项目类型中有一个名为“manifest.json”的文件,则应该执行标准编辑器而不是我的自定义编辑器。
visual-studio visual-studio-extensions vsix visual-studio-package
1个回答
2
投票

最后,在开源示例支持的大量尝试和错误方法之后,我通过以下步骤解决了我的问题:

  1. 正如在问题中发布的任何样本中一样实现自定义编辑器(如Editor With Toolbox)。
  2. 在编辑器工厂类(实现IVsEditorFactory的类)中,在CreateEditorInstance函数内,您可以创建这样的条件,将编辑器限制为具有特定名称的JSON文件:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
  1. 要将我们的自定义编辑器限制为特定的自定义项目,我们需要在模板项目文件(ProjectTemplate.csproj)中使用元数据标记我们的目标文件(以了解有关元数据的更多信息,查找msbuild元数据),如下所示:
<Content Include="manifest.json" >
    <IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
  1. 要检查编辑器工厂内的元数据,我们将继续我们在CreateEditorInstance函数中的工作,如下所示: 4.1我们已经将这两个参数传递给CreateEditorInstance函数:(IVsHierarchy pvHieruint itemid)。 4.2使用这两个参数获取父项目的IVsBuildPropertyStorage(某些代码示例在线存在)。 4.3使用此代码检查我们的标记元数据:
buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}

一旦我使用此自定义编辑器完成自定义项目,我将发布其GitHub链接以获得更清晰的信息。

© www.soinside.com 2019 - 2024. All rights reserved.