在 Visual Studio 扩展中更改“颜色主题”
Posted
技术标签:
【中文标题】在 Visual Studio 扩展中更改“颜色主题”【英文标题】:Changing "Color theme" within a Visual Studio Extension 【发布时间】:2015-10-01 08:49:22 【问题描述】:我正在用 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?
【问题讨论】:
你完成了这个扩展吗?如果完成了,你是否发布到扩展市场以支持当前的 Visual Studio 2019 版本? 【参考方案1】:ShellSettingsManager
使您能够访问和修改 Visual Studio 设置,但只能在 Windows 注册表中。在重新启动之前,您所做的任何更改都不会被 Visual Studio 拾取,因为 VS 仅在启动时才从注册表中读取设置。所以这是错误的做法。
要更改设置并在不重新启动的情况下应用它们,您必须使用DTE2.Properties,如here 中所述。以下代码 sn-p 显示了可以从 Environment/General 页面以编程方式更改的所有设置(您可以在此处更改主题):
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 将立即应用更改。问题是没有属性可以让您更改主题。这就是为什么我认为它做不到。
【讨论】:
来晚了,但感谢@HadiBrais 的撰写。【参考方案2】:这是最简单的方法:
概述:
-
使用“导入和导出设置”功能创建两个文件:
DarkTheme.vssettings 和 LightTheme.vssettings
以编程方式调用 Tools.ImportandExportSettings 命令在适当的时候导入这些文件。
详情:
创建两个设置文件:
-
启动 Visual Studio 并通过 UI 将主题设置为“Light”
从“工具”菜单中选择“导入和导出设置...”
在向导中,选择“导出选定的环境设置”并单击“下一步”
在“您要导出哪些设置?”页面,取消选择除“选项/字体和颜色”之外的所有内容,然后单击“下一步”
将此文件命名为“Light.vssettings”并将其保存在已知位置。
为“Dark”主题重复第 1 步到第 5 步,将文件命名为“Dark.vssettings”。
要以编程方式导入这些文件,请使用带有“/import”参数的 DTE.ExecuteCommand,如下所示:
如果您还没有 EnvDTE.dll,请添加对它的引用。
var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings""");
希望对你有帮助。
【讨论】:
以上是关于在 Visual Studio 扩展中更改“颜色主题”的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual Studio Code 中更改无标题选项卡的标题
如何在 Visual Studio 2010 中更改 vim 光标的颜色