Событие изменения шрифтов и цветов VSIX (Visual Studio Extension)

Я пишу расширение Visual Studio 2012/2013, и по соображениям производительности все значения конфигурации кэшируются.

Чтобы сделать изменения в «Шрифтах и ​​цветах» видимыми в режиме реального времени, мне нужно знать, когда параметры были изменены пользователем.

Есть ли способ получать уведомления, если какие-либо настройки параметров были изменены пользователем?

На данный момент у меня есть обходной путь и я использую событие Windows.WindowCreated в моем методе Initialize:

Dispatcher.CurrentDispatcher.BeginInvoke(
    new Action( () => {
        DTE.Events.WindowEvents.WindowCreated += WindowEvents_WindowCreated;
    } ), DispatcherPriority.ApplicationIdle, null );

person Michael A. Volz aka Flynn    schedule 04.12.2013    source источник


Ответы (3)


Вы можете использовать IVsTextManagerEvents.OnUserPreferencesChangedсобытие. См. Пакет VS — получение дополнительных шрифтов и событий изменения цвета для примера кода.

person Sergey Vlasov    schedule 05.12.2013
comment
+1, я лично использовал это, чтобы добиться именно того, что ищет ОП. Обратите внимание, что все еще есть ошибки (в VS 2013) с получением заданного цвета из службы хранения шрифтов и цветов с параметром NOAUTOCOLORS, когда тема изменена, а цвет установлен на «Автоматически» — для обходного пути (который работает!) см. ответ Джоша в тема форума по этой проблеме - person Cameron; 08.12.2013
comment
Теперь я снова сталкиваюсь с этой проблемой на VS2015 и 2017... Невероятно. - person Blake Niemyjski; 19.05.2017

Событие, которое вы ищете, IEditorFormatMap::FormatMappingChanged. Это срабатывает при изменении значения в разделе «Шрифты и цвета». Этот интерфейс специфичен для конкретного экземпляра ITextView, но вы можете легко агрегировать его по всем созданным экземплярам ITextView.

Чтобы получить этот интерфейс, вам нужно будет импортировать IEditorFormatMapFactoryService. Этот сервис обеспечивает сопоставление от ITextView -> IEditorFormatMap

person JaredPar    schedule 04.12.2013
comment
Это мои первые шаги с расширениями Visual Studio. Полный пример кода был бы действительно полезен. - person Michael A. Volz aka Flynn; 05.12.2013
comment
@Flynn, к сожалению, полный пример кода выходит далеко за рамки того, что я могу поместить в ответ на переполнение стека. Примеры расширения VS, как правило, такие. Однако вы можете начать с просмотра следующей ссылки. Эти два файла сговорились, чтобы просмотреть точное событие, которое я упомянул. github.com/jaredpar/VsVim/blob/ master/Src/VimWpf/Implementation/ github.com/jaredpar/VsVim/blob/master/Src/VimWpf/Implementation/ - person JaredPar; 05.12.2013
comment
«Полный пример кода», возможно, неправильная формулировка. Мне нужна только базовая структура (возможно, с использованием MEF), чтобы добраться до этого события. Чтобы перейти к событию WindowCreated, я использовал: DTE.Events.WindowEvents.WindowCreated += WindowEvents_WindowCreated; Есть ли что-то подобное, чтобы перейти к событию изменения настроек? - person Michael A. Volz aka Flynn; 11.12.2013
comment
Еще раз спасибо, ваш ответ дал мне достаточно информации, чтобы найти правильный ответ. - person Michael A. Volz aka Flynn; 11.12.2013

Спасибо за ваш вклад. Кажется, я нашел что-то полезное. У меня есть IWpfTextViewCreationListener. Я добавил следующие строки кода:

[Import]
public IEditorFormatMapService FormatMapService = null; // MEF

public void TextViewCreated( IWpfTextView textView ) {
    IEditorFormatMap editorFormatMap = FormatMapService.GetEditorFormatMap( textView );
    editorFormatMap.FormatMappingChanged += FormatMapChanged;
}

void FormatMapChanged( object sender, FormatItemsEventArgs e ) {
    /* do something */
}

FormatItemsEventArgs включают все измененные шрифты и цвета. Это именно то, что мне было нужно.

person Michael A. Volz aka Flynn    schedule 11.12.2013
comment
public void TextViewCreated( IWpfTextView textView ) Кто это называет?? Как вы получили текстовое представление, которое вам нужно?? Почему так чертовски сложно найти хоть один работающий пример!! Документы MS являются одними из худших из доступных, а пользовательский контент практически отсутствует! Как кто-то разбирается в этом??? - person Josh Sanders; 26.10.2015