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

17

我正在用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版本? - myusrn
2个回答

11

ShellSettingsManager可以让您访问并修改Visual Studio设置,但只能在Windows注册表中进行。任何更改都不会被Visual Studio捕获,直到重启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
虽然已经很晚了,但还是感谢 @HadiBrais 的撰写。 - Cameron Wilby

3
这是最简单的方法:
概述:
1. 使用“导入和导出设置”功能创建两个文件:DarkTheme.vssettings 和 LightTheme.vssettings。 2. 编程调用 Tools.ImportandExportSettings 命令,在适当的时间导入这些文件。
详细步骤:
要创建这两个设置文件:
1. 启动 Visual Studio,并通过 UI 将主题设置为“Light”。 2. 从“工具”菜单中选择“导入和导出设置...”。 3. 在向导中,选择“导出所选环境设置”,然后单击“下一步”。 4. 在“您要导出哪些设置?”页面上,除了“选项/字体和颜色”以外的所有内容都不选,然后单击“下一步”。 5. 将此文件命名为“Light.vssettings”,并将其保存在已知位置。 6. 对于“Dark”主题,请重复步骤 1 到 5,并将文件命名为“Dark.vssettings”。
要以编程方式导入这些文件,请使用 DTE.ExecuteCommand 并带有“/import”参数,如下所示:
如果您还没有 EnvDTE.dll,请添加对它的引用。
var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings""");

我希望能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接