Visual Studio 特定文件的自定义编辑器
Visual Studio Custom Editor for Specific File
上下文:
我正在为 visual studio 2017 创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“manifest.json”的文件。
我需要为“manifest.json”文件创建自定义 editor\designer,当用户在“”中双击该文件时解决方案资源管理器”,它会打开我的自定义编辑器。
我已经在 Microsoft Doc 上找到了几篇文章(比如这篇 Create custom editors and designers) and found some GitHub examples about creating custom editors and custom designer (like this Editor_With_Toolbox, SingleFileGenerator, WPFDesigner_XML and Snippet Designer)。
问题:
- 大多数文章、示例和文档都解释了如何将自定义编辑器与特定文件扩展名相关联(在我的例子中,我想将编辑器与特定文件相关联“manifest.json" 在特定项目中)。
- 与单个文件生成器相关的文章,它们不适合我的解决方案,因为它们谈到一个文件在设计器中编辑,另一个文件在解决方案中发出(如 windows 表单设计器)。
总结:
我想实施 visual studio 自定义 editor\designer,运行 仅为我的自定义项目模板中的特定文件。如何实现?
备注:
- 要在自定义编辑器中关联的文件必须命名为“manifest.json”。
- 如果在其他项目类型中有名为“manifest.json”的文件,则应执行标准编辑器而不是我的自定义编辑器。
最终在开源示例支持的大量尝试和错误方法之后,我通过以下步骤解决了我的问题:
- 像在问题中 posted 的任何示例一样正常实施自定义编辑器(如 Editor With Toolbox)。
- 在编辑器工厂class(实现
IVsEditorFactory
的class)里面,在CreateEditorInstance
函数里面,可以这样设置条件来限制编辑器JSON 个具有特定名称的文件:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
- 为了将我们的自定义编辑器限制为特定的自定义项目,我们需要在模板项目文件 (
ProjectTemplate.csproj
) 中用元数据标记我们的目标文件(要了解有关元数据的更多信息,请查找 msbuild 元数据),如下所示:
<Content Include="manifest.json" >
<IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
为了检查编辑器工厂中的元数据,我们将在 CreateEditorInstance
函数中继续我们的工作,如下所示:
4.1 我们已经将这 2 个参数传递给 CreateEditorInstance
函数:(IVsHierarchy pvHier
和 uint itemid
)。
4.2 使用这2个参数获取父工程的IVsBuildPropertyStorage
(部分代码示例网上有)
4.3 使用此代码检查我们的标记元数据:
buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
使用此自定义编辑器完成自定义项目后,我将 post 其 GitHub link 更清晰。
上下文:
我正在为 visual studio 2017 创建自定义项目模板,效果很好。在这个项目模板中,我发出一个名为“manifest.json”的文件。
我需要为“manifest.json”文件创建自定义 editor\designer,当用户在“”中双击该文件时解决方案资源管理器”,它会打开我的自定义编辑器。
我已经在 Microsoft Doc 上找到了几篇文章(比如这篇 Create custom editors and designers) and found some GitHub examples about creating custom editors and custom designer (like this Editor_With_Toolbox, SingleFileGenerator, WPFDesigner_XML and Snippet Designer)。
问题:
- 大多数文章、示例和文档都解释了如何将自定义编辑器与特定文件扩展名相关联(在我的例子中,我想将编辑器与特定文件相关联“manifest.json" 在特定项目中)。
- 与单个文件生成器相关的文章,它们不适合我的解决方案,因为它们谈到一个文件在设计器中编辑,另一个文件在解决方案中发出(如 windows 表单设计器)。
总结:
我想实施 visual studio 自定义 editor\designer,运行 仅为我的自定义项目模板中的特定文件。如何实现?
备注:
- 要在自定义编辑器中关联的文件必须命名为“manifest.json”。
- 如果在其他项目类型中有名为“manifest.json”的文件,则应执行标准编辑器而不是我的自定义编辑器。
最终在开源示例支持的大量尝试和错误方法之后,我通过以下步骤解决了我的问题:
- 像在问题中 posted 的任何示例一样正常实施自定义编辑器(如 Editor With Toolbox)。
- 在编辑器工厂class(实现
IVsEditorFactory
的class)里面,在CreateEditorInstance
函数里面,可以这样设置条件来限制编辑器JSON 个具有特定名称的文件:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
- 为了将我们的自定义编辑器限制为特定的自定义项目,我们需要在模板项目文件 (
ProjectTemplate.csproj
) 中用元数据标记我们的目标文件(要了解有关元数据的更多信息,请查找 msbuild 元数据),如下所示:
<Content Include="manifest.json" >
<IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>
为了检查编辑器工厂中的元数据,我们将在
CreateEditorInstance
函数中继续我们的工作,如下所示:4.1 我们已经将这 2 个参数传递给
CreateEditorInstance
函数:(IVsHierarchy pvHier
和uint itemid
)。4.2 使用这2个参数获取父工程的
IVsBuildPropertyStorage
(部分代码示例网上有)4.3 使用此代码检查我们的标记元数据:
buildPropertyStorage.GetItemAttribute(itemid, "IsWebExtensionManifest", out string propVal);
if (!Convert.ToBoolean(propVal))
{
return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
使用此自定义编辑器完成自定义项目后,我将 post 其 GitHub link 更清晰。