Получение / настройка 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>);