2013-06-03 4 views
2

В моем визуальном расширении Studio 2012 Я получаю Активный 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?

+0

Каков ваш сценарий? Что вы пытаетесь сделать своим продлением? Вполне возможно, что вы должны использовать API-интерфейсы редактора и полностью не участвовать в DTE. –

+0

Когда вы выбираете тест в тестовом бегуне, он открывает файл и переходит к строке теста. Мне нужно знать номер строки, который карет перемещается (и, следовательно, строка теста), когда файл открывается. Событие WindowActivated всегда возвращает 1, потому что оно запускается до перемещения каретки. Я рад использовать все, что могу, чтобы получить правильный результат. – jheppinstall

+0

И что вы собираетесь делать, когда у вас есть это? –

ответ

0

Grumble ... Я надеялся, что существует более прямой способ сделать то, что вы хотите.

Для событий в интерфейсе EnvDTE я ничего не знаю, чтобы это сделать. Интерфейс основного редактора для просмотра, когда ящик явно расположен, равен ITextCaret.PositionChanged. Способ, которым вы подключаете один, заключается в экспорте IWpfTextViewCreationListener, и когда вы получаете вызванный метод TextViewCreated, вам передается представление, и свойство Caret на нем будет иметь событие. Затем вы можете прикрепить к событию нормально и делать то, что хотите.

Есть несколько странных вещей, с которыми вы можете столкнуться в этом подходе, в общем: во-первых, вы не обязательно будете знать, была ли каретная навигация выполнена пользователем или с помощью какой-либо автоматизированной системы. Во-вторых, не ожидайте, что повторная навигация будет работать, потому что, если я нажму на единичный тест, и это то, что я уже сделал, перехват каретной навигации не будет.

Возможно, вам все равно будет лучше, если конкретные тестовые ролики, о которых вы заботитесь, допускают расширяемость. Многие бегуны «подключаются», адаптер сообщает бегуну, где находится исходный код. Многие адаптеры для многих бегунов имеют открытый исходный код, поэтому для простого исправления может возникнуть гораздо лучший опыт в долгосрочной перспективе.