Получение / настройка Track Changes установка значения свойства через DTE в Visual Studio 2019 - PullRequest
0 голосов
/ 08 декабря 2018

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

Код, который отлично работал с Visual Studio2012-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");

, но безуспешно.

1 Ответ

0 голосов
/ 03 мая 2019

Сотрудники 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>);
    
...