4

В расширение Visual Studio, которое я построил, мне нужно выделить вызовы методов в редакторе Visual Studio. Например:Экспорт пользовательских EditorFormatDefinition во время выполнения

enter image description here

Я хотел бы использовать HSV цвета, чтобы разделить спектр цвета в соответствии с количеством уникальных вызовов.

я могу добиться выделения цветом, если я экспортировать каждый цвет в качестве своего собственного EditorFormatDefinition:

[Export(typeof(EditorFormatDefinition))] 
[ClassificationType(ClassificationTypeNames = "red-background")] 
[Name("red-background")] 
[UserVisible(true)] 
[Order(After = Priority.High)] 
public sealed class RedBackground : ClassificationFormatDefinition 
{ 
    public RedBackground() 
    { 
     DisplayName = "red-background"; 
     BackgroundColor = Colors.Red; 
    } 
} 

Однако это требует от меня, чтобы вручную настроить все цвета, которые я хотел бы использовать загодя. Есть ли способ экспортировать EditorFormatDefinitions во время выполнения?

Некоторые реестры, такие как IContentTypeRegistryService и IClassificationTypeRegistryService, позволяют создавать новые типы и классификации контента во время выполнения. Существует ли аналогичный API для EditorFormatDefinitions.

В качестве альтернативы, можно ли динамически экспортировать MEF EditorFormatDefinition в Visual Studio?

ответ

4

Решение состоит в использовании IClassificationFormatMapService для запроса определенного IClassificationFormatMap. Затем мы можем запросить TextFormattingRunProperties и создать новый набор свойств форматирования текста, который мы можем добавить к IClassificationFormatMap.

//No reason to use identifier, just a default starting point that works for me. 
var identiferClassificationType = registryService.GetClassificationType("identifier"); 
var classificationType = registryService.CreateClassificationType(name, SpecializedCollections.SingletonEnumerable(identiferClassificationType)); 
var classificationFormatMap = ClassificationFormatMapService.GetClassificationFormatMap(category: "text"); 
var identifierProperties = classificationFormatMap 
    .GetExplicitTextProperties(identiferClassificationType); 

//Now modify the properties 
var color = System.Windows.Media.Colors.Yellow; 
var newProperties = identifierProperties.SetForeground(color); 
classificationFormatMap.AddExplicitTextProperties(classificationType, newProperties); 

//Now you can use or return classificationType... 

Благодаря Кевину Пильчу-Биссону за помощь в этом вопросе.

+0

Возможно ли изменить порядок во время выполнения? Я имею в виду функциональность, которую предоставляет OrderAttribute. – TDenis

+0

Я нашел эту вторую перегрузку, которая позволяет установить приоритет: IClassificationFormatMap.AddExplicitTextProperties (IClassificationType, TextFormattingRunProperties, Тип классификации) – cyanbeam

Смежные вопросы