从Visual Studio文本装饰扩展获取当前文件名

时间:2015-11-25 11:11:51

标签: c# mef

我是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
        }
    }
}

3 个答案:

答案 0 :(得分:1)

你通过依赖注入获得了它。

由于您只提交了2行代码,我认为您的上下文是由您明确设置的,或者由调用您代码的某个环境隐式设置。

  • 您应该声明属性而不是 field
  • 应该公开

然后自动大哥会在你第一次访问它之前为你设置它。

<强> ...或...

您可以使用构造函数注入。注意:创建课程的不是你。

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]

到我的班级