C# 改变;“色彩主题”;在VisualStudio扩展中

C# 改变;“色彩主题”;在VisualStudio扩展中,c#,visual-studio,visual-studio-2012,C#,Visual Studio,Visual Studio 2012,我正在用C#编写一个Visual Studio扩展,我希望它能根据一天中的时间改变颜色主题(日落后会应用深色主题-日出时会根据用户的喜好应用蓝色/浅色主题) 我可以使用ShellSettingsManager对象公开的WriteableSettingsStore更改颜色主题。当我执行以下代码时,主题在重新启动VisualStudio后发生更改 var settingsManager = new ShellSettingsManager(this); var writeableUserStore

我正在用C#编写一个Visual Studio扩展,我希望它能根据一天中的时间改变颜色主题(日落后会应用深色主题-日出时会根据用户的喜好应用蓝色/浅色主题)

我可以使用
ShellSettingsManager
对象公开的
WriteableSettingsStore
更改颜色主题。当我执行以下代码时,主题在重新启动VisualStudio后发生更改

var settingsManager = new ShellSettingsManager(this);
var writeableUserStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);

writeableUserStore.SetString("General", "CurrentTheme", GuidList.guidDarkTheme);
我更喜欢的是自动更新主题-我已经尝试使用user32api的
UpdateWindow
RedrawWindow
函数,但是窗口不会重新加载


因此,问题是-在更改注册表中的CurrentTheme属性后,如何“重画”Visual Studio?

ShellSettingsManager
允许您访问和修改Visual Studio设置,但只能在Windows注册表中。Visual Studio在重新启动之前不会拾取您所做的任何更改,因为VS仅在启动时从注册表读取设置。所以这是错误的方法

要更改设置并应用它们而不需要重新启动,您必须使用中讨论的。以下代码段显示了可以从“环境/常规”页面以编程方式更改的所有设置(您可以在此处更改主题):


所有这些设置都可以更改,VS将立即应用更改。问题是没有任何属性允许您更改主题。这就是为什么我认为这是不可能做到的。

以下是最简单的方法:

概述:

  • 使用“导入和导出设置”功能创建两个文件: DarkTheme.vssettings和LightTheme.vssettings
  • 以编程方式调用Tools.ImportandExportSettings命令,以便在适当的时间导入这些文件
  • 详细信息:

    要创建两个设置文件,请执行以下操作:

  • 启动VisualStudio并通过UI将主题设置为“Light”
  • 从“工具”菜单中选择“导入和导出设置…”
  • 在向导中,选择“导出选定的环境设置”,然后单击“下一步”
  • 在“要导出哪些设置?”页面中,取消选择除“选项/字体和颜色”之外的所有设置,然后单击“下一步”
  • 将此文件命名为“Light.vssettings”,并将其保存在已知位置
  • 对“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""");
    

    我希望这会有所帮助。

    已经很晚了,但感谢您的来信@HadiBrais。您是否完成了此扩展?如果完成了,您是否向扩展市场发布了对当前visual studio 2019版本的支持?
    AnimationSpeed: 5
    RichClientExperienceOptions: 65535
    WindowMenuContainsNItems: 10
    CloseButtonActiveTabOnly: True
    UseTitleCaseOnMenu: False
    AutoAdjustExperience: True
    Animations: True
    AutohidePinActiveTabOnly: False
    ShowStatusBar: True
    MRUListContainsNItems: 10
    
    var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
    dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings""");