如何使用MEF在Visual Studio扩展中获取当前的ActiveDocument?

时间:2014-06-11 13:17:47

标签: visual-studio mef visual-studio-extensions

我正在尝试阅读Active Document内容类型和代码时使用MEF处理Visual Studio 2013 Extension。目前它只在编辑器中的Document / ProjectItem的Opening Time读取。打开这些文件后,只要我们在打开的文档选项卡之间切换,它就不会再次读取这些内容。

要求:我希望此扩展程序读取当前Active Document的内容类型和代码文本。

更新
问题我知道,使用EnvDTE80.DTE2.ActiveWindow,我可以获得当前专注的文档,但我在这里混淆了如何调用此代码来读取当前活动文档/窗口的内容?让我们说如果我们有10个文档,则需要通过此扩展读取活动文档(获得当前焦点)。这里VsTextViewCreated只在我们打开一个新文档或者在文本视图被创建之前关闭的文档时被调用。它不会被称为已打开的文档(即已创建的文本视图),因此我们无法在将焦点移动到其他已经打开的文档时获得更新的wpfTextView对象。我在这里混淆了如何使用DTE2.ActiveDocument或DTE2.ActiveWindow事件处理程序调用它。

问题:
这是否可以在MEF中使用,而不使用DTE?
VS编辑器中是否存在任何处理TextView的界面?

这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Threading.Tasks;
using Microsoft.VisualStudio.Text.Tagging;
using Microsoft.VisualStudio.Text.Editor;

using System.ComponentModel.Composition;
using Microsoft.VisualStudio.Utilities;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.TextManager.Interop;
using Microsoft.VisualStudio.OLE.Interop;
using System.Diagnostics;

namespace VSIXProject_Test
{
    [Export(typeof(IVsTextViewCreationListener))]
    [ContentType("code")]
    [TextViewRole(PredefinedTextViewRoles.Editable)]
    class VsTextViewCreationListener : IVsTextViewCreationListener
    {
        [Import]
        IVsEditorAdaptersFactoryService AdaptersFactory = null;

        public void VsTextViewCreated(IVsTextView textViewAdapter)
        {
            var wpfTextView = AdaptersFactory.GetWpfTextView(textViewAdapter);
            if (wpfTextView == null)
            {
                Debug.Fail("Unable to get IWpfTextView from text view adapter");
                return;
            }

            Debug.Write(wpfTextView.TextBuffer.ContentType.TypeName);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

幸运的是,我得到了我想要实现的目标。已发布帮助解决方案here: 我在dte2.Events.WindowsEvents.WindowActived中使用了helper方法,并获取了IVsTextView对象来检索文本缓冲区。这是我的WindowActivated事件的代码片段:

void WindowEvents_WindowActivated(EnvDTE.Window GotFocus, EnvDTE.Window LostFocus)
    {

        if (null != GotFocus.Document)
        {
            Document curDoc = GotFocus.Document;
            Debug.Write("Activated : " + curDoc.FullName);
            this.IvsTextView=GetIVsTextView(curDoc.FullName); //Calling the helper method to retrieve IVsTextView object.
            if (IvsTextView != null)
            {
                IvsTextView.GetBuffer(out curDocTextLines); //Getting Current Text Lines 

                //Getting Buffer Adapter to get ITextBuffer which holds the current Snapshots as wel..
                Microsoft.VisualStudio.Text.ITextBuffer curDocTextBuffer = AdaptersFactory.GetDocumentBuffer(curDocTextLines as IVsTextBuffer); 
                Debug.Write("\r\nContentType: "+curDocTextBuffer.ContentType.TypeName+"\nTest: " + curDocTextBuffer.CurrentSnapshot.GetText());

            }
        }
    }

现在使用VS Editor中打开的所有代码文档。希望这能帮助像我这样的人。