【问题标题】:Event fired when caret position changes in Document?文档中插入符号位置更改时触发的事件?
【发布时间】:2013-06-03 21:05:55
【问题描述】:

在我的 Visual Studio 2012 扩展中,我正在使用 Active EnvDTE.Document

windowEvents = dte2.Events.WindowEvents;
windowEvents.WindowActivated += WindowActivated;

private void WindowActivated(Window gotfocus, Window lostfocus)
{
    if (gotfocus.Type == vsWindowType.vsWindowTypeDocument)
    {
        ProcessDocument(gotfocus.Document);
    }            
}     

我想知道文档中的插入符号位置何时发生变化,但我找不到合适的事件来附加。我发现了一些像textEditorEvents.LineChanged 这样的事件,但这只会在文本更改时触发。我需要处理的情况是插入符号位置发生更改,但未更改为文本。

实现这一目标的最佳方法是什么?是否存在这样的 Document 事件?

【问题讨论】:

  • 你的方案是什么?你想让你的扩展做什么?您很可能应该使用编辑器 API 并完全远离 DTE。
  • 当您在测试运行器中选择测试时,它会打开文件并移动到测试行。我需要知道打开文件时插入符号移动到的行号(以及测试的行)。 WindowActivated 事件总是返回 1,因为它在插入符号移动之前被触发。我很乐意尽我所能获得正确的结果。
  • 拥有它之后你会怎么做?
  • 之后,我将找到出现在下一行中的一些文本,然后打开另一个文件并导航到该文本中出现的行号。有问题的文件是 SpecFlow feature.cs 文件。
  • 好的,所以我们真正遇到的是一个 XY 问题。这是什么测试运行器?你的实际情况是什么?

标签: visual-studio-extensions envdte


【解决方案1】:

抱怨...我希望有一种更直接的方式来做你想做的事。

对于事件,我所知道的 EnvDTE 界面中没有任何内容可以执行此操作。用于查看插入符号何时显式定位的核心编辑器界面是ITextCaret.PositionChanged。您连接一个的方式是导出一个 IWpfTextViewCreationListener,当您调用 TextViewCreated 方法时,您将获得视图,并且其上的 Caret 属性将具有该事件。然后,您可以正常附加到该事件并使用它做您想做的事情。

一般来说,使用这种方法可能会遇到一些奇怪的事情:首先,您不一定知道插入符号导航是由用户完成的还是通过某些自动化系统完成的。其次,不要指望重复导航也能起作用,因为如果我单击单元测试并且我已经这样做了,就不会拦截插入符号导航。

您最好还是看看您关心的特定测试运行器是否允许可扩展性。许多跑步者是“可插拔的”,适配器告诉跑步者源代码在哪里。许多跑步者的许多适配器都是开源的,因此在那里进行简单的修复可能会带来更好的长期体验。

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多