代码之家  ›  专栏  ›  技术社区  ›  Borislav Ivanov

在Visual Studio 2019中通过DTE获取/设置轨迹更改设置属性值

  •  0
  • Borislav Ivanov  · 技术社区  · 6 年前

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

    使用VisualStudio2012-2017工作的代码:

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

    正在抛出 COMException 显示以下消息: “索引无效。(hresult的异常:0x8002000b(disp_e_badeindex))” EnvDTE._DTE.get_Properties(String Category, String Page) 在Visual Studio 2019中。

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

    • 视觉工作室2017:

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

    • 视觉工作室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 回复  |  直到 6 年前
        1
  •  0
  •   Borislav Ivanov    6 年前

    微软员工 clarified 可以使用以下任何一种方法:

    • 使用 IVsTextManager3.SetUserPreferences3() . 也可以在旧版本的visual studio中使用(我使用visualstudio 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>);