Getting/setting Track Changes 设置 属性 值通过 DTE 在 Visual Studio 2019

Getting/setting Track Changes setting property value trough DTE in Visual Studio 2019

我有一个 Visual Studio 扩展,它获取值然后将值设置为 选项对话框中的文本编辑器 -> 常规 -> 跟踪更改设置。

与 Visual Studio 2012-2017 一起正常工作的代码:

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

正在抛出 COMException 并包含以下消息:"Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))" at EnvDTE._DTE.get_Properties(String Category, String Page) in Visual Studio 2019。

显然设置已移动,所以我试图获取新位置,将设置导出到 Visual Studio 2017 年和 2019 年的文件,并比较结果:

我仍然不确定如何使用这些信息,因为 DTE.Properties 的索引器接受两个参数:CategoryPage。我已经尝试过以下方法:

        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");

但没有成功。

Microsoft 工作人员clarified认为可以使用以下任何一种方法:

  • 使用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>);