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

2023-12-09

我正在使用 MEF 开发 Visual Studio 2013 扩展,同时尝试读取 Active Document 内容类型和代码。目前,它仅在编辑器中打开文档/项目项时读取。一旦打开它们,每当我们在打开的文档选项卡之间切换时,它就不会再次读取它们。

要求:我希望此扩展能够读取当前活动文档的内容类型和代码文本。

Updated:
Problem:我知道,使用 EnvDTE80.DTE2.ActiveWindow,我可以获取当前聚焦的文档,但我很困惑如何调用此代码来读取当前活动文档/窗口的内容?假设我们有 10 个文档,则活动文档(获得当前焦点)需要由 this 扩展读取。这里,只有当我们打开一个新文档或创建文本视图之前关闭的文档时,才会调用 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);
        }
    }
}

幸运的是,我得到了我想要达到的目标。辅助解决方案已经发布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 编辑器中打开的所有代码文档。希望这能帮助像我这样的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MEF 获取 Visual Studio 扩展中的当前 ActiveDocument? 的相关文章

随机推荐

  • 具有模糊和斜角的 GLPaint 画笔效果

    我正在开发一个基于 GLPaint 代码的绘图应用程序 有人知道如何获得这样的效果吗 我尝试过使用不同的画笔宽度和高度值 但它仍然保持不变 我需要考虑 glBlendFunc 吗 或者彻底改变画笔的宽度和高度是否可以实现 Thanks in
  • C++ 中是否有生产就绪的无锁队列或哈希实现 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我一直在谷歌上搜索 C 中的无锁队列 我找到了一些代码和一些试验 但我无法编译任何东西 无锁哈希也将受到欢迎 概括 到目前为止我还没有得到肯定的答案
  • 如何在命令行中读取浮点数?

    如何在命令行中读取浮点数或整数 test py 11 22 4 11 7 99 9 69 我试过了 numbersList float sys argv 1 len sys argv import sys args map float sy
  • 正则表达式匹配 C# 中的所有大写和下划线

    我需要从字符串中查找仅包含大写字母和下划线的所有单词 string str ABCD EFG LMNO hello world PQR ST UVW US Apple PQR ZYZ PQR LMN ZYZ string pattern A
  • 10.6中如何在Interface Builder中创建NSImageCell的NSMatrix

    如何在 Interface Builder 3 2 1 即为 Snow Leopard 制作的 中创建 NSImageCell 单元格 通常位于 NSImageView 中 的矩阵 NSMatrix 对象 在 过去 您可以拖动 NSImag
  • Spring @Transactional 属性是否适用于私有方法?

    如果我有一个 事务性Spring bean中的私有方法上的注释 注释有什么作用吗 If the Transactional注释位于公共方法上 它可以工作并打开事务 public class Bean public void doStuff
  • 如何绘制堆叠柱类型的 Google 图表

    我有这个表结构 Name Grade Count X VeryGood 10 X Excellent 2 X Failed 0 Y VeryGood 7 Y Excellent 1 Y Failed 2 我想在堆积谷歌图表中显示这些数据 类
  • 使用宏将数据文件导入新选项卡时,如何提示用户选择文件?

    我有一个宏 当前正在创建一个新工作表 并将另一个 Excel 文件导入到这个新工作表中 然后 该工作表中的数据将被拉入工作簿的其他区域 正在导入的文件将始终具有不同的文件名 如何调整以下代码以提示用户选择文件 目录不会改变 子导入需求 工作
  • 使用 pygame 进行 blit opencv 相机捕获会抛出 TypeError:参数 1 必须是 pygame.Surface,而不是 cv2.VideoCapture

    我是 pygame 的新手 以前从未使用过它 想知道如何使用 pygame 和 opencv 将网络摄像头传输或显示到表面 但我不断收到消息 Traceback most recent call last File
  • 在 Android 中裁剪图像并调整其大小

    我正在从磁盘读取图像并将其显示在行中ListView 图像文件比需要在内部显示的文件大ImageView的行 由于我需要缓存bitmaps为了更快的访问 我希望它们只和 RAM 一样大ImageView小号 85x85 倾角 现在我正在阅读
  • 如何获取模型观察者中的current_user?

    给定以下模型 Room id title RoomMembers id room id RoomFeed also an observer 当房间标题更新时 我想创建一个 RoomFeed 项目 显示进行更新的用户是谁 room updat
  • 在 Youtube api 中创建播放列表

    我看过 Youtube 的文档 但我似乎不明白如何为用户专门为 ios 创建播放列表 我知道用户需要使用 OAuth 2 登录来授予应用程序访问 权限来创建播放列表 文档链接 https developers google com yout
  • https 是否保留在相对表单操作 URL 上?

    考虑一个带有通过 https 访问的表单的页面 如果表单操作具有表单页面的相对 URL 是否保留 https 协议 例如 您访问 https example com cart html 其中包含表单标签
  • 如何在不使用 printf 的情况下打印指针地址

    我正在做一个练习 需要打印指针的内存 地址 这样做很容易printf p 但我不被允许使用它 你知道我如何在不使用的情况下获得地址吗printf 我唯一可以使用的功能是 写入 这是我的练习声明 编写一个函数 它需要 const void a
  • 在固定功能管道绘图中使用 FBO 将 OpenGL 场景渲染为纹理

    问题 我从事开源游戏 torcs 的工作 http torcs sourceforge net 游戏的图形管线仍然使用OpenGL 1 3的固定功能管线 FFP 我尝试将游戏场景渲染到 FBO 帧缓冲区对象 中的纹理 以便对渲染的纹理进行一
  • Android 上 SQLite 数据库的最大大小是多少?

    我有一个大小超过 2 6 GiB 的 SQLite 数据库 数据库包含地图 该数据库由 RMaps 应用程序使用 当以最大缩放比例将地图移动到某些部分时 应用程序突然关闭 但是 没有强制关闭消息 也没有报告按钮 所以 我有一个想法 它是由超
  • ArrayList<对象> JSON

    我正在尝试使用 Restlet 返回 JSON 数据 我可以使用以下命令返回单个项目的 JSON import org json JSONObject Site aSite new Site getSite JSONObject aSite
  • noSelectionOption 属性[重复]

    这个问题在这里已经有答案了 我是 JSF 新手 我遇到了noSelectionOptionJSF 2 0 中的属性 我不明白这个属性的目的 根据描述 它在需要选择并且用户选择时使用noSelectionOption导致验证错误 So if
  • 在字母表列表中查找缺失的字母

    我正在尝试解决以下问题 在传递的字母范围中找到丢失的字母并将其返回 如果所有字母都出现在该范围内 则返回 undefined 我将得到的字符串输入是 abce 应返回 d bcd 应该返回未定义 abcdefghjklmno 应该返回 i
  • 如何使用 MEF 获取 Visual Studio 扩展中的当前 ActiveDocument?

    我正在使用 MEF 开发 Visual Studio 2013 扩展 同时尝试读取 Active Document 内容类型和代码 目前 它仅在编辑器中打开文档 项目项时读取 一旦打开它们 每当我们在打开的文档选项卡之间切换时 它就不会再次