2015-07-13 70 views
16

我正在C#中編寫Visual Studio擴展,希望根據一天中的時間更改顏色主題(日落之後,將應用黑暗主題 - 日出時藍色/淡色主題將根據用戶偏好進行應用)。在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?

回答

11

ShellSettingsManager使您能夠訪問和修改Visual Studio設置,但只能在Windows註冊表中使用。您所做的任何更改都不會被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

剛剛在VS 2017中重試,結果相同。 –

+0

@ErwinMayer感謝您的更新。 –

2

下面是做到這一點的最簡單的方法:

概述:

  1. 使用 「導入&導出設置」 功能來創建兩個文件: DarkTheme.vssettings和LightTheme.vssettings
  2. 以編程方式調用Tools.ImportandExportSettings命令以在適當的時間導入這些文件。

詳情:

要創建兩個設置文件:

  1. 啓動Visual Studio和通過UI
  2. 設置主題,以 「光」 從工具菜單中選擇「導入和導出設置...「
  3. 在嚮導中,選擇」導出所選環境設置「並單擊」下一步「
  4. 在「您想要導出哪些設置?「頁面,取消選擇」選項/字體和顏色「以外的所有內容,然後單擊」下一步「
  5. 將此文件命名爲」Light.vssettings「並將其保存在已知位置
  6. 重複步驟1到5, 。主題,該文件命名爲「Dark.vssettings」

要導入這些文件以編程方式使用DTE.ExecuteCommand,像這樣的「/導入」參數:

如果你不加入一個參考EnvDTE.dll已經沒有了。

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

我希望有幫助。