在Visual Studio扩展中更改“颜色主题”

我正在用C#编写一个Visual Studio扩展,希望根据一天中的时间改变颜色主题(日落之后将应用黑暗主题 – 在日出时,将根据用户偏好应用蓝色/浅色主题)。

我可以使用ShellSettingsManager对象公开的WriteableSettingsStore更改颜色主题。 当我执行以下代码时,重新启动Visual Studio后主题更改。

 var settingsManager = new ShellSettingsManager(this); var writeableUserStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); writeableUserStore.SetString("General", "CurrentTheme", GuidList.guidDarkTheme); 

我更喜欢的是自动更新主题 – 我尝试使用User32 API的UpdateWindowRedrawWindow函数,但窗口没有重新加载。

所以问题是 – 如何在更改注册表中的CurrentTheme属性后“重绘”Visual Studio?

ShellSettingsManager使您可以访问和修改Visual Studio设置,但仅限于Windows注册表。 在重新启动之前,Visual Studio将不会选择您所做的任何更改,因为VS仅在启动时才从注册表中读取设置。 所以这是错误的做法。

要同时更改设置并应用它们而不需要重新启动,您将必须使用DTE2.Properties ,如此处所述。 以下代码段显示了可以从“环境/常规”页面以编程方式更改的所有设置(您可以在此处更改主题):

 EnvDTE.Properties generalProps = dte2Obj.Properties["Environment", "General"]; for (int i = 1; i <= generalProps.Count; ++i) { System.Diagnostics.Debug.WriteLine( generalProps.Item(i).Name + ": " + generalProps.Item(i).Value); } 

默认情况下,在VS2013中,此代码将生成以下输出:

 AnimationSpeed: 5 RichClientExperienceOptions: 65535 WindowMenuContainsNItems: 10 CloseButtonActiveTabOnly: True UseTitleCaseOnMenu: False AutoAdjustExperience: True Animations: True AutohidePinActiveTabOnly: False ShowStatusBar: True MRUListContainsNItems: 10 

所有这些设置都可以更改,VS将立即应用更改。 问题是没有可以让您更改主题的属性。 这就是我认为无法做到的原因。

这是最简单的方法:

概述:

  1. 使用“导入和导出设置”function创建两个文件:DarkTheme.vssettings和LightTheme.vssettings
  2. 以编程方式调用Tools.ImportandExportSettings命令以在适当的时间导入这些文件。

细节:

要创建两个设置文件:

  1. 启动Visual Studio并通过UI将主题设置为“Light”
  2. 从“工具”菜单中选择“导入和导出设置…”
  3. 在向导中,选择“导出所选环境设置”,然后单击“下一步”
  4. 在“您要导出哪些设置?” 页面,取消选择“选项/字体和颜色”以外的所有内容,然后单击“下一步”
  5. 将此文件命名为“Light.vssettings”并将其保存在已知位置。
  6. 对“Dark”主题重复步骤1到5,命名文件“Dark.vssettings”。

要以编程方式导入这些文件,请使用带有“/ import”参数的DTE.ExecuteCommand,如下所示:

如果您还没有EnvDTE.dll,请添加对EnvDTE.dll的引用。

 var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE; dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings"""); 

我希望有所帮助。