繁体   English   中英

自定义Visual Studio编辑器中的替代字体

[英]Overriding font in custom Visual Studio editor

问题在于,使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还是以某种方式映射到默认编辑器的分类。

我的问题是:我应该怎么做才能控制为自定义内容类型指定的自定义编辑器的文本外观?

我认为您走在正确的道路上,但是您需要执行类似于斜体注释扩展名ViewCreationListener的操作 具体来说,对视图使用GetClassificationFormatMap(在内容类型上键入一个视图创建侦听器),而不是设置默认的文本属性,而是为分类类型设置属性。 如您所见,格式映射确实在视图之间共享,因此您不想更改默认值。

您可能需要为该类型提供ClassificationFormatDefinition。 也许还是想这样做,只是为了在“字体和颜色”中显示一些内容。


为了后人:我不认为GetClassificationFormatMap(String)方法采用ContentType。 我不再需要任何代码,我也不记得它是如何工作的,但是我不认为“外观类别”与内容类型有关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM