Estoy escribiendo una extensión de Visual Studio en C# que espero cambie el tema de color dependiendo de la hora del día (después de la puesta del sol se aplicará el tema oscuro - al amanecer se aplicará el tema azul/claro dependiendo de la preferencia de los usuarios ).
Puedo cambiar el tema de color usando WriteableSettingsStore expuesto por un objeto ShellSettingsManager . Cuando ejecuto el siguiente código, el tema cambia después de reiniciar Visual Studio.
var settingsManager = new ShellSettingsManager(this); var writeableUserStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); writeableUserStore.SetString("General", "CurrentTheme", GuidList.guidDarkTheme); Lo que preferiría es que el tema se actualice automáticamente: he intentado utilizar las funciones UpdateWindow y RedrawWindow de la API User32, pero la ventana no se vuelve a cargar.
Entonces, la pregunta es: ¿cómo "redibujo" Visual Studio después de cambiar la propiedad CurrentTheme en el registro?
ShellSettingsManager le permite acceder y modificar la configuración de Visual Studio, pero solo en el registro de Windows. Cualquier cambio que realice no será recogido por Visual Studio hasta que se reinicie porque VS lee la configuración del registro solo cuando se inicia. Así que este es el enfoque equivocado.
Para cambiar la configuración y aplicarla sin necesidad de reiniciar, deberá usar DTE2.Properties como se describe aquí . El siguiente fragmento de código muestra todas las configuraciones que se pueden cambiar mediante programación desde la página Entorno/General (aquí es donde puede cambiar el tema):
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); }De forma predeterminada en VS2013, este código producirá el siguiente resultado:
AnimationSpeed: 5 RichClientExperienceOptions: 65535 WindowMenuContainsNItems: 10 CloseButtonActiveTabOnly: True UseTitleCaseOnMenu: False AutoAdjustExperience: True Animations: True AutohidePinActiveTabOnly: False ShowStatusBar: True MRUListContainsNItems: 10Todas estas configuraciones se pueden cambiar y VS aplicará inmediatamente los cambios. El problema es que no hay ninguna propiedad que te permita cambiar el tema. Por eso creo que no se puede hacer.
Esta es la forma más sencilla de hacerlo:
Visión de conjunto:
Detalles:
Para crear los dos archivos de configuración:
Para importar estos archivos mediante programación, use DTE.ExecuteCommand con el parámetro "/importar" de esta manera:
Agregue una referencia a EnvDTE.dll si aún no la tiene.
var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE; dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings""");Espero que eso ayude.