2015-07-13 7 views
16

Sto scrivendo un'estensione Visual Studio in C# che spero cambierà il tema del colore in base all'ora del giorno (Dopo il tramonto verrà applicato il tema scuro - all'alba o il tema blu/chiaro verrà applicato in base alle preferenze dell'utente).Modifica "Tema colore" all'interno di un'estensione Visual Studio

Sono in grado di modificare il tema del colore utilizzando WriteableSettingsStore esposto da un oggetto ShellSettingsManager. Quando eseguo il seguente codice, il tema cambia dopo aver riavviato Visual Studio.

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

writeableUserStore.SetString("General", "CurrentTheme", GuidList.guidDarkTheme); 

Quello che preferisco è quello di avere automaticamente l'aggiornamento tema - ho provato a fare uso dei UpdateWindow e RedrawWindow funzioni della API User32, ma la finestra non ricarica.

Quindi la domanda è: come si "ridisegna" Visual Studio dopo aver modificato la proprietà CurrentTheme nel Registro di sistema?

risposta

11

ShellSettingsManager consente di accedere e modificare le impostazioni di Visual Studio ma solo nel registro di Windows. Qualsiasi modifica apportata non verrà rilevata da Visual Studio finché non viene riavviata poiché VS legge le impostazioni dal registro solo all'avvio. Quindi questo è l'approccio sbagliato.

Per modificare entrambe le impostazioni e applicarle senza richiedere il riavvio, sarà necessario utilizzare DTE2.Properties come descritto in here. Il seguente frammento di codice mostra tutte le impostazioni che possono essere modificate a livello di codice dal/pagina Generale Ambiente (è qui che si può cambiare il 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); 
} 

Per impostazione predefinita in VS2013, questo codice produrrà il seguente output:

AnimationSpeed: 5 
RichClientExperienceOptions: 65535 
WindowMenuContainsNItems: 10 
CloseButtonActiveTabOnly: True 
UseTitleCaseOnMenu: False 
AutoAdjustExperience: True 
Animations: True 
AutohidePinActiveTabOnly: False 
ShowStatusBar: True 
MRUListContainsNItems: 10 

Tutte queste impostazioni possono essere modificate e VS applicherà immediatamente le modifiche. Il problema è che non esiste una proprietà che ti permetta di cambiare il tema. Ecco perché penso che non si possa fare.

+1

Appena ritentato in VS 2017, stessi risultati. –

+0

@ErwinMayer Grazie per l'aggiornamento. –

2

Ecco il modo più semplice per farlo:

Panoramica:

  1. Utilizzare la funzione "Importa impostazioni & Export" per creare due file: DarkTheme.vssettings e LightTheme.vssettings
  2. Attivare a livello di programmazione il comando Tools.ImportandExportSettings per importare quei file al momento opportuno.

Dettagli:

per creare i file due impostazioni:

  1. lancio di Visual Studio e impostare il tema di "Luce" attraverso l'interfaccia utente
  2. Dal menu Strumenti selezionare " Importa ed esporta impostazioni ... "
  3. Nella procedura guidata, selezionare" Esporta impostazioni ambiente selezionate "e fare clic su" Avanti "
  4. Nella sezione "Quali impostazioni si desidera esportare?"pagina, deseleziona tutto eccetto" Opzioni/Caratteri e colori "e fai clic su" Avanti "
  5. Assegna un nome a questo file" Light.vssettings "e salvalo in una posizione nota.
  6. Ripeti i passaggi da 1 a 5 per" Dark " . tema, nominando il file "Dark.vssettings"

per importare questi file di programmazione utilizzare DTE.ExecuteCommand con il parametro "/ import" come questo:

Aggiungere un riferimento alla EnvDTE.dll se don

var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE; 
dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings"""); 

Spero che questo aiuti.