Изменение темы "Цвет" в расширении Visual Studio
Я пишу расширение Visual Studio в С#, которое, я надеюсь, изменит цветную тему в зависимости от времени суток (после заката темная тема будет применена - при восходе солнца будет применена синяя/легкая тема в зависимости от предпочтения пользователей).
Я могу изменить цветную тему, используя WriteableSettingsStore
, выставленный объектом ShellSettingsManager
. Когда я выполняю следующий код, тема изменяется после перезапуска Visual Studio.
var settingsManager = new ShellSettingsManager(this);
var writeableUserStore = settingsManager.GetWritableSettingsStore(SettingsScope.UserSettings);
writeableUserStore.SetString("General", "CurrentTheme", GuidList.guidDarkTheme);
Я бы предпочел, чтобы обновление темы автоматически - я попытался использовать функции UpdateWindow
и RedrawWindow
API User32, но окно не перезагружается.
Итак, вопрос в том, как "перерисовать" Visual Studio после изменения свойства CurrentTheme в реестре?
Ответы
Ответ 1
ShellSettingsManager
позволяет вам получать доступ и изменять настройки Visual Studio, но только в реестре Windows. Любые сделанные вами изменения не будут восприняты Visual Studio до тех пор, пока они не будут перезапущены, потому что VS считывает настройки из реестра только при его запуске. Так что это неправильный подход.
Чтобы изменить настройки и применить их, не требуя перезагрузки, вам нужно будет использовать DTE2.Properties, как описано в здесь. В следующем фрагменте кода отображаются все параметры, которые могут быть изменены программно на странице "Окружающая среда/общий" (здесь вы можете изменить тему):
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 немедленно применит изменения. Проблема в том, что нет свойства, которое позволяет вам изменять тему. Вот почему я думаю, что это невозможно.
Ответ 2
Вот простейший способ сделать это:
Обзор:
- Используйте функцию "Импорт и экспорт" для создания двух файлов:
Параметры DarkTheme.vssettings и LightTheme.vssettings
- Программно вызывать команду Tools.ImportandExportSettings для импорта этих файлов в соответствующее время.
Детали:
Чтобы создать два файла настроек:
- Запустите Visual Studio и установите тему "Свет" через интерфейс пользователя
- В меню "Сервис" выберите "Импорт и экспорт настроек..."
- В мастере выберите "Экспортировать выбранные настройки среды" и нажмите "Далее"
- В разделе "Какие настройки вы хотите экспортировать?", отмените выбор всех, кроме "Параметры/Шрифты и цвета", и нажмите "Далее"
- Назовите этот файл "Light.vssettings" и сохраните его в известном месте.
- Повторите шаги с 1 по 5 для темы "Темный", назвав файл "Параметры темной жизни".
Чтобы импортировать эти файлы программным путем, используйте DTE.ExecuteCommand с параметром "/import" следующим образом:
Добавьте ссылку на EnvDTE.dll, если у вас ее еще нет.
var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
dte.ExecuteCommand("Tools.ImportandExportSettings", @"/import:""C:\yourpath\LightTheme.vssettings""");
Я надеюсь, что это поможет.