Пользовательский редактор Visual Studio для конкретного файла - PullRequest
0 голосов
/ 29 декабря 2018

Контекст:

Я создаю собственный шаблон проекта для Visual Studio 2017, который работает хорошо.Внутри этого шаблона проекта я создаю файл с именем " manifest.json ".

Мне нужно создать собственный редактор \ дизайнер для файла " manifest.json "вот когда пользователь дважды щелкает этот файл в « Solution Explorer », он открывает мой пользовательский редактор.

Я уже нашел несколько статей о Microsoft Doc (например, Создание пользовательских редакторови дизайнеры ) и нашли несколько примеров GitHub о создании пользовательских редакторов и пользовательских дизайнеров (например, Editor_With_Toolbox , SingleFileGenerator , WPFDesigner_XML и Дизайнер сниппетов).

Проблема:

  • В большинстве статей, примеров и документации объясняется, как связать пользовательский редактор с конкретным расширением файла (в моем случае я хочу связатьредактор с определенным файлом " manifest.json " в конкретном проекте).
  • Статьи, относящиеся к генератору одного файла, они не соответствуют моему решению, потому что они spКаждый файл редактируется в конструкторе, а другой файл выводится в решении (например, конструктор форм Windows).

Резюме:

Я хочу реализовать пользовательский редактор Visual Studio \дизайнер, который работает только для определенного файла в моем шаблоне проекта.Как этого добиться?

Примечания:

  • Файл, который нужно связать в настраиваемом редакторе, должен называться " manifest.json ".
  • Если в других типах проектов есть файл с именем " manifest.json ", стандартный редактор должен выполняться не моим пользовательским редактором.

1 Ответ

0 голосов
/ 10 января 2019

Наконец, после большого количества попыток и ошибок, поддерживаемых примерами с открытым исходным кодом, я получил решение своей проблемы, выполнив следующие шаги:

  1. Внедряйте пользовательский редактор как обычно, как в любом из примеров, опубликованных ввопрос (например, Editor With Toolbox ).
  2. Внутри класса фабрики редактора (класс, который реализует IVsEditorFactory), внутри функции CreateEditorInstance, вы можете сделать условие следующим образом:ограничить редактор JSON-файлами с определенным именем:
if (System.IO.Path.GetFileName(pszMkDocument).ToLower() != "manifest.json")
{
    return VSConstants.VS_E_UNSUPPORTEDFORMAT;
}
Чтобы ограничить наш пользовательский редактор конкретным пользовательским проектом, нам нужно пометить наш целевой файл метаданными (чтобы узнать больше о метаданных, посмотрите метаданные msbuild) в файле проекта шаблона (ProjectTemplate.csproj) следующим образом:
<Content Include="manifest.json" >
    <IsWebExtensionManifest>true</IsWebExtensionManifest>
</Content>

Чтобы проверить метаданные внутри фабрики редакторов, мы продолжим нашу работу в функции CreateEditorInstance следующим образом:

4.1 У нас уже есть эти 2 параметра, переданные в CreateEditorInstancefunction: (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;
}

Как только я закончу свой пользовательский проект с помощью этого пользовательского редактора, я опубликую его ссылку на GitHub для большей ясности.

...