在Visual Studio 2019中通过DTE获取/设置跟踪更改来设置属性值

时间:2018-12-07 23:19:04

标签: visual-studio envdte 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))” 在Visual Studio 2019中的EnvDTE._DTE.get_Properties(String Category, String Page)。 / p>

显然是移动了设置,所以我尝试获取新位置,将设置导出到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的索引器接受两个参数: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");

但没有成功。

1 个答案:

答案 0 :(得分:0)

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服务。在Visual Studio 2019和更高版本中添加了此API:

    <IEditorOptionsFactoryService>.GlobalOptions.GetOptionValue<bool>(DefaultTextViewHostOptions.ChangeTrackingId);
    <IEditorOptionsFactoryService>.GlobalOptions.SetOptionValue<bool>(DefaultTextViewHostOptions.ChangeTrackingId, <true/false>);