在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的UpdateWindow
和RedrawWindow
函数,但窗口没有重新加载。
所以问题是 – 如何在更改注册表中的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将立即应用更改。 问题是没有可以让您更改主题的属性。 这就是我认为无法做到的原因。
这是最简单的方法:
概述:
- 使用“导入和导出设置”function创建两个文件:DarkTheme.vssettings和LightTheme.vssettings
- 以编程方式调用Tools.ImportandExportSettings命令以在适当的时间导入这些文件。
细节:
要创建两个设置文件:
- 启动Visual Studio并通过UI将主题设置为“Light”
- 从“工具”菜单中选择“导入和导出设置…”
- 在向导中,选择“导出所选环境设置”,然后单击“下一步”
- 在“您要导出哪些设置?” 页面,取消选择“选项/字体和颜色”以外的所有内容,然后单击“下一步”
- 将此文件命名为“Light.vssettings”并将其保存在已知位置。
- 对“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""");
我希望有所帮助。