问题在于使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 会以某种方式映射到默认编辑器的分类。
我的问题是:如何控制为自定义内容类型指定的自定义编辑器的文本外观?
答案 0 :(得分:0)
我认为你正走在正确的道路上,但你需要做一些与ViewCreationListener of the italicizing comments extension类似的事情。具体来说,对视图使用GetClassificationFormatMap(使用视图创建侦听器键入内容类型),而不是设置默认文本属性,设置分类类型的属性。正如您所观察到的,格式映射会在视图之间共享,因此您不想更改默认值。
您可能需要为该类型提供ClassificationFormatDefinition。也许想要做到这一点,只是为了让字体和字母显示出来。颜色。
对于后代:我不认为GetClassificationFormatMap(String)方法采用ContentType。我不再使用该代码了,我根本不记得这是如何工作的,但我不会想到一个&#34;外观类别&#34;与内容类型有关。