Получение / настройка Track Changes установка значения свойства через DTE в Visual Studio 2019

У меня есть расширение Visual Studio, которое получает значение, а затем задает значение для параметра "Редактор текста" -> "Общие" -> "Отслеживать изменения" в диалоговом окне "Параметры".

Код, который отлично работал с Visual Studio 2012-2017:

DTE vsEnvironment = (DTE)GetService(typeof(DTE));
Property trackChangesProperty = vsEnvironment.Properties["TextEditor", "General"].Item("TrackChanges");

бросает COMException со следующим сообщением: "Неверный индекс. (Исключение из HRESULT: 0x8002000B (DISP_E_BADINDEX))" в EnvDTE._DTE.get_Properties(String Category, String Page) в Visual Studio 2019.

Судя по всему, настройки перемещены, поэтому я, пытаясь получить новое местоположение, экспортировал настройки в файл в Visual Studio 2017 и 2019 и сравнил результаты:

  • Visual Studio 2017:

    <ToolsOptionsCategory name="TextEditor" RegisteredName="TextEditor">
    <ToolsOptionsSubCategory name="General" RegisteredName="General" PackageName="Text Management Package">
        <PropertyValue name="TrackChanges">true</PropertyValue>
    </ToolsOptionsSubCategory>
    

  • Visual Studio 2019:

    <Category name="Text Editor_General" Category="{c178af61-531a-46f0-bd57-102d9e42c711}" Package="{e269b994-ef71-4ce0-8bcd-581c217372e8}" RegisteredName="Text Editor_General" PackageName="Microsoft.VisualStudio.Editor.Implementation.EditorPackage">
    <PropertyValue name="TrackChanges">true</PropertyValue>
    

Я все еще не уверен, как использовать информацию, как индексатор DTE.Properties принимает два параметра: Category а также Page, Я уже попробовал следующее:

        vsEnvironment.Properties["TextEditor", null].Item("TrackChanges");
        vsEnvironment.Properties["TextEditor", string.Empty].Item("TrackChanges");
        vsEnvironment.Properties["Text Editor_General", null].Item("TrackChanges");
        vsEnvironment.Properties["Text Editor_General", string.Empty].Item("TrackChanges");

но без успеха.

0 ответов

Сотрудники Microsoft пояснили, что может быть использован любой из следующих подходов:

  • использование IVsTextManager3.SetUserPreferences3(), Также доступно в более старых версиях Visual Studio (я тестировал с Visual Studio 2012 - 2019), но довольно уродливый API:

    IVsTextManager3 textManager = this.GetService(typeof(VsTextManagerClass)) as IVsTextManager3;
    
    VIEWPREFERENCES3[] viewPreferences3Array = new VIEWPREFERENCES3[1];
    FONTCOLORPREFERENCES2[] fontColorPreferences2Array = new FONTCOLORPREFERENCES2[1];
    FRAMEPREFERENCES2[] framePreferences2Array = new FRAMEPREFERENCES2[1];
    LANGPREFERENCES2[] langPreferences2Array = new LANGPREFERENCES2[1];
    
    textManager.GetUserPreferences3(viewPreferences3Array, framePreferences2Array, langPreferences2Array, fontColorPreferences2Array);
    
    VIEWPREFERENCES3 viewPreferences3 = viewPreferences3Array[0];
    viewPreferences3.fTrackChanges = 0;
    textManager.SetUserPreferences3(new VIEWPREFERENCES3[] { viewPreferences3 }, framePreferences2Array, langPreferences2Array, fontColorPreferences2Array);
    
  • использование IEditorOptionsFactoryService MEF сервис. Этот API добавлен в Visual Studio 2019 и более поздних версиях:

    <IEditorOptionsFactoryService>.GlobalOptions.GetOptionValue<bool>(DefaultTextViewHostOptions.ChangeTrackingId);
    <IEditorOptionsFactoryService>.GlobalOptions.SetOptionValue<bool>(DefaultTextViewHostOptions.ChangeTrackingId, <true/false>);
    
Другие вопросы по тегам