Подтвердить что ты не робот

Переопределение шрифта в пользовательском редакторе Visual Studio

Проблема заключается в том, что пользовательский редактор внутри расширения 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 каким-то образом сопоставляет классификацию по умолчанию.

Мой вопрос: что мне делать, чтобы контролировать внешний вид текста настраиваемого редактора, назначенного для настраиваемого типа контента?

4b9b3361

Ответ 1

Я думаю, что вы на правильном пути, но вам нужно сделать что-то похожее на ViewCreationListener курсивного добавления комментариев. В частности, используйте GetClassificationFormatMap для представления (с помощью прослушивателя создания представлений с ключом вашего типа контента), а вместо настройки свойств текста по умолчанию задайте свойства для вашего типа классификации. Как вы заметили, карты формата получают общий доступ к представлениям, поэтому вы не хотите изменять значение по умолчанию.

Вам может потребоваться предоставить ClassificationFormatDefinition для этого типа. Возможно, захочется сделать это в любом случае, просто чтобы что-то появилось в шрифтах и ​​цветах.


Для потомков: я не думаю, что метод GetClassificationFormatMap (String) принимает ContentType. У меня больше нет кода, и я вообще не помню, как это работает, но я не думаю, что "категория внешнего вида" связана с типами контента.