Проблема заключается в том, что пользовательский редактор внутри расширения VS выглядит иначе, чем требует текущая тема. Редактор размещается внутри диалогового окна и должен иметь тот же шрифт, который определяет диалог хостинга.
Тип содержимого редактора определяется следующим образом:
[Export]
[Name("MyContent")]
[BaseDefinition("code")]
public static readonly ContentTypeDefinition ExportContentTypeDefinition = null;
И существует определение типа классификации:
[Export]
[Name("MyContentText")]
[BaseDefinition("text")]
public static readonly ClassificationTypeDefinition MyTextDefinition = null;
Поставщик классификатора определяется следующим образом:
[Export(typeof(IClassifierProvider))]
[ContentType("MyContent")]
public class ClassifierProvider : IClassifierProvider
{
[Import]
public IClassificationTypeRegistryService ClassificationTypesRegistry { get; set; }
public IClassifier GetClassifier(ITextBuffer textBuffer)
{
return new Classifier(
ClassificationTypesRegistry.GetClassificationType("MyContentText"));
}
}
В то время как классификатор предоставляет только один и тот же формат для любого моментального снимка:
public class Classifier : IClassifier
{
private readonly IClassificationType _classificationType;
public Classifier(IClassificationType classificationType)
{
_classificationType = classificationType;
}
public IList<ClassificationSpan> GetClassificationSpans(SnapshotSpan span)
{
return new [] { new ClassificationSpan(span, _classificationType)};
}
public event EventHandler<ClassificationChangedEventArgs> ClassificationChanged;
}
Теперь, в коде при создании редактора, я пытаюсь переопределить свойства соответствия IClassificationFormatMap
:
var contentType = contentTypeRegistryService.GetContentType("MyContent");
var textBuffer = textBufferFactoryService.CreateTextBuffer(initialText, contentType);
var textView = textEditorFactoryService.CreateTextView(textBuffer);
...
var formatMap = classificationFomatMapService
.GetClassificationFormatMap("MyContentText");
formatMap.DefaultTextProperties = formatMap.DefaultTextProperties
.SetFontRenderingEmSize(dialog.FontSize)
.SetTypeface(
new Typeface(
dialog.FontFamily,
dialog.FontStyle,
dialog.FontWeight,
dialog.FontStretch));
Однако это изменение не влияет на мой экземпляр редактора.
Кроме того, карта формата, возвращаемая из перегрузки classificationFomatMapService.GetClassificationFormatMap(ITextView)
, отличается от той, которая была возвращена из вышеперечисленной перегрузки. И изменение этого другого экземпляра формата также влияет на все редакторы кода в исполняемом экземпляре Visual Studio, поэтому я должен сделать вывод, что, несмотря на мои усилия, textView каким-то образом сопоставляет классификацию по умолчанию.
Мой вопрос: что мне делать, чтобы контролировать внешний вид текста настраиваемого редактора, назначенного для настраиваемого типа контента?