簡體   English   中英

特定文件的Visual Studio自定義編輯器

[英]Visual Studio Custom Editor for Specific File

語境:

我正在為Visual Studio 2017創建自定義項目模板,效果很好。 在此項目模板內,我發出一個名為“ manifest.json ”的文件。

我需要為“ manifest.json ”文件創建自定義編輯器\\設計器,當用戶在“ 解決方案資源管理器 ”中雙擊該文件時,它將打開我的自定義編輯器。

我已經在Microsoft Doc上找到了幾篇文章(例如“ 創建自定義編輯器和設計器” ),並找到了一些有關創建自定義編輯器和自定義設計器的GitHub示例(例如此Editor_With_ToolboxSingleFileGeneratorWPFDesigner_XMLSnippet Designer )。

問題:

  • 大多數文章,示例和文檔都說明了如何將自定義編輯器與特定文件擴展名相關聯(在我的情況下,我想將編輯器與特定項目中的特定文件“ manifest.json ”相關聯)。
  • 有關單個文件生成器的文章,它們不適合我的解決方案,因為它們談論的是文件是在設計器中編輯的,而另一個文件是在解決方案中發出的(例如Windows窗體設計器)。

摘要:

我想實現只在我的自定義項目模板中的特定文件上運行的Visual Studio自定義編輯器\\設計器。 如何實現呢?

筆記:

  • 在定制編輯器中要關聯的文件必須命名為“ manifest.json ”。
  • 如果其他項目類型中有一個名為“ manifest.json ”的文件,則應執行標准編輯器而不是我的自定義編輯器。

最終,在開源示例支持了許多嘗試和錯誤方法之后,我可以通過以下步驟解決問題:

  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鏈接以更加清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM