2015-07-13 132 views
16

我正在C#中编写Visual Studio扩展,希望根据一天中的时间更改颜色主题(日落之后,将应用黑暗主题 - 日出时蓝色/淡色主题将根据用户偏好进行应用)。在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?

回答

11

ShellSettingsManager使您能够访问和修改Visual Studio设置,但只能在Windows注册表中使用。您所做的任何更改都不会被Visual Studio拾取,直到它重新启动为止,因为VS仅在启动时才从注册表读取设置。所以这是错误的方法。

要更改设置并应用它们而不需要重新启动,您必须使用DTE2.Properties,如here中所述。下面的代码片段显示了以编程方式从环境/普通网页更改的所有设置(这是你可以更改主题):

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

刚刚在VS 2017中重试,结果相同。 –

+0

@ErwinMayer感谢您的更新。 –

2

下面是做到这一点的最简单的方法:

概述:

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

详情:

要创建两个设置文件:

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

要导入这些文件以编程方式使用DTE.ExecuteCommand,像这样的“/导入”参数:

如果你不加入一个参考EnvDTE.dll已经没有了。

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

我希望有帮助。