我是VS扩展开发的新手。我目前正在使用VS 2015中的文字装饰样本,并且能够正确显示彩色框。现在我想扩展样本,以便装饰只出现在某些文件名上。
谷歌说我可以使用ITextDocumentFactoryService.TryGetTextDocument
接口与IWpfTextView.TextBuffer
属性来获取文件名。听起来不错。但我似乎无法真正获得界面。
在我的班上,我有:
[Import]
public ITextDocumentFactoryService TextDocumentFactoryService = null;
但它始终为NULL。
我如何获得ITextDocumentFactoryService
?
namespace Test
{
internal sealed class TestAdornment
{
[Import]
public ITextDocumentFactoryService TextDocumentFactoryService = null;
public TestAdornment(IWpfTextView view)
{
}
/// <summary>
/// Adds the scarlet box behind the 'a' characters within the given line
/// </summary>
/// <param name="line">Line to add the adornments</param>
private void CreateVisuals(ITextViewLine line)
{
// TextDocumentFactoryService is NULL
}
}
}
答案 0 :(得分:1)
你通过依赖注入获得了它。
由于您只提交了2行代码,我认为您的上下文是由您明确设置的,或者由调用您代码的某个环境隐式设置。
然后自动大哥会在你第一次访问它之前为你设置它。
<强> ...或... 强>
您可以使用构造函数注入。注意:创建课程的不是你。
private readonly ITextDocumentFactoryService _textDocumentFactoryService;
[ImportingConstructor]
internal YourClass(ITextDocumentFactoryService textDocumentFactoryService)
{
_textDocumentFactoryService = textDocumentFactoryService;
}
答案 1 :(得分:1)
TextAdornmentTextViewCreationListener.cs
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TextAdornmentTextViewCreationListener : IWpfTextViewCreationListener
{
[Import]
public ITextDocumentFactoryService textDocumentFactory { get; set; }
//...
public void TextViewCreated(IWpfTextView textView)
{
new TextAdornment(textView, textDocumentFactory);
}
}
TextAdornment.cs
internal sealed class TextAdornment
{
private readonly ITextDocumentFactoryService textDocumentFactory;
private ITextDocument TextDocument;
//...
public TextAdornment(IWpfTextView view, ITextDocumentFactoryService textDocumentFactory)
{
//...
this.textDocumentFactory = textDocumentFactory;
//...
}
internal void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e)
{
var res = this.textDocumentFactory.TryGetTextDocument(this.view.TextBuffer, out this.TextDocument);
if (res)
{
//this.TextDocument.FilePath;
}
else
{
//ERROR
}
}
}
答案 2 :(得分:0)
所以在我的情况下,我需要将import语句放入AdornmentTextViewCreationListener。这实现了IWpfTextViewCreationListener,并且是具有以下装饰类的那个。
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
然后我可以添加
private readonly ITextDocumentFactoryService _textDocumentFactoryService;
[ImportingConstructor]
到我的班级