在自定义Visual Studio编辑器中覆盖字体

时间:2014-12-01 09:53:21

标签: c# visual-studio visual-studio-2012

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

我的问题是:如何控制为自定义内容类型指定的自定义编辑器的文本外观?

1 个答案:

答案 0 :(得分:0)

我认为你正走在正确的道路上,但你需要做一些与ViewCreationListener of the italicizing comments extension类似的事情。具体来说,对视图使用GetClassificationFormatMap(使用视图创建侦听器键入内容类型),而不是设置默认文本属性,设置分类类型的属性。正如您所观察到的,格式映射会在视图之间共享,因此您不想更改默认值。

您可能需要为该类型提供ClassificationFormatDefinition。也许想要做到这一点,只是为了让字体和字母显示出来。颜色。


对于后代:我不认为GetClassificationFormatMap(String)方法采用ContentType。我不再使用该代码了,我根本不记得这是如何工作的,但我不会想到一个&#34;外观类别&#34;与内容类型有关。