- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 MEF 开发 Visual Studio 2013 扩展,同时尝试读取 Active Document 内容类型和代码。目前,它仅在编辑器中打开文档/项目项时读取。一旦打开它们,每当我们在打开的文档选项卡之间切换时,它就不会再次读取它们。
要求:我希望此扩展能够读取当前事件文档的内容类型和代码文本。
更新:
问题:我知道,使用EnvDTE80.DTE2.ActiveWindow,我可以获取当前聚焦的文档,但我很困惑如何调用此代码来读取当前事件文档/窗口的内容?假设我们有 10 个文档,则事件文档(获得当前焦点)需要由 this 扩展读取。这里,只有当我们打开一个新文档或在创建 TextView 之前关闭的文档时,才会调用 VsTextViewCreated。它不会被调用已经打开的文档(即已经创建的 TextView ),因此当我们将焦点移到其他已经打开的文档上时,我们将无法获得更新的 wpfTextView 对象。我很困惑如何使用 DTE2.ActiveDocument 或 DTE2.ActiveWindow 事件处理程序来调用它。
问题:
在 MEF 中这是否可能,而不使用 DTE?
VS 编辑器中是否存在处理 TextView 的接口(interface)?
这是我的代码:
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);
}
}
}
最佳答案
幸运的是,我得到了我想要实现的目标。帮助解决方案已发布 here :我在 dte2.Events.WindowsEvents.WindowActived 中使用了辅助方法并获取 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 编辑器中打开的所有代码文档。希望这能帮助像我这样的人。
关于visual-studio - 如何使用 MEF 获取 Visual Studio 扩展中的当前 ActiveDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24163986/
如何在 Microsoft Word 中获取 ActiveDocument 的 Windows 句柄? 我希望将句柄值保存到一个变量中。 最佳答案 您可以使用 FindWindow 函数获取当前事件的
我在 Word VSTO 加载项项目中有一行代码,它曾经可以工作但突然不再工作了: Microsoft.Office.Interop.Word.Document doc = Globals.ThisA
我在我的 64 位 Vista 机器上为 Photoshop CS5.1 写了一个相当大的脚本。现在,当我在我的新 64 位 Windows 7 机器上运行完全相同的脚本时,Adobe ExtendS
我正在编写 Visual Studio 2008 扩展。我想在每次 DTE.ActiveDocument 更改时收到通知,因此我可以在自定义面板中更新某些内容,该面板执行与解决方案资源管理器类似的功能
我还看过其他几篇 StackOverflow 帖子,例如这篇: How to Use/Enable (RegExp object) Regular Expression using VBA (MACR
我正在尝试访问脚本中当前打开的文档,但它未定义。但我已经在 Photoshop 中打开了文档。我应该以某种方式初始化它吗?这是我的代码 function ProcessDocumentWithoutX
我正在尝试操纵 Visual Studio 文本编辑器滚动条值。问题是我只有 dte.ActiveDocument,不可能从那里完成。 当 VS 启动并且我捕获 dte.Events.CommandE
我正在尝试计算 Word 文档中图片形状的左侧位置,以便我可以使图像在页面上居中。为此,我需要知道左边距值以及左右边距之间可用页面的宽度。 我的问题是,当我的宏运行时,出现错误,因为 ActiveDo
我正在创建一个 VSTO Office 2007 加载项。 我需要启用或找到一个解决方案,可以使用 byte[] 而不是硬盘驱动器保存到 Web 服务。 所以,我通过访问一个网站并单击一个 URL 打
我正在使用 MEF 开发 Visual Studio 2013 扩展,同时尝试读取 Active Document 内容类型和代码。目前,它仅在编辑器中打开文档/项目项时读取。一旦打开它们,每当我们在
我在另一个线程中使用了 Jtchase08 提供的代码的修改版本,当我将对象库更改为相关的 Microsoft Word 版本时,它在 Excel 2010 和 2016 中工作正常,但是试图使同样的
我是一名优秀的程序员,十分优秀!