在 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 的 UpdateWindowRedrawWindow 函数,但窗口不会重新加载。

所以问题是 - 如何在更改注册表中的 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 定义中停止环境路径扩展

在 Visual Studio Code 中更改无标题选项卡的标题

如何在 Visual Studio 2010 中更改 vim 光标的颜色

如何在 Visual Studio 2019 中更改行距?

Visual Studio 2015,使用 GIT 扩展和数据库项目 .dbmdl 文件

在 Visual Studio Code 中调试 python 程序时更改代码