2015-01-06 6 views
1

Я играю с созданием команды редактирования текста Visual Studio. Я добрался до создания пакета, связав команду, поместив ее в меню. Но то, что я не могу сделать по рекомендованному Microsoft, - это выяснить, есть ли активное текстовое представление, к которому должна применяться команда.IVsTextManager :: GetActiveView (true, null, ...) возвращает нефокусированный вид

Я делаю следующие шаги в the VSSDK tutorial (прокрутите вниз до Используя команду меню, чтобы добавить комментарий Украшение). Выбрав команду из меню, mt command handler вызывается все правильно. однако, когда выполняется следующий точный код учебника, результаты, которые я получаю, непоследовательны.

IVsTextManager txtMgr = (IVsTextManager)GetService(typeof(SVsTextManager)); 
IVsTextView vTextView = null; 
int mustHaveFocus = 1; 
txtMgr.GetActiveView(mustHaveFocus, null, out vTextView); 

Теперь, если есть только текстовые виды, все работает так, как вы ожидали: возвращается активный текстовый вид. Но нарисовать другое изображение на картинке (я использую редактор Bitmap), и вид, возвращаемый GetActiveView, выглядит как последний активный текстовый вид. I. e., Если я переключаю вкладки, чтобы отобразить растровое изображение по ранее активному виду до fileA, тот же вид для fileA. Другими словами, я не могу понять, сосредоточено ли текстовое представление или нет.

Теперь это кажется несовместимым с (как бы бедным) documentation от IVsTextManager::GetActiveView(). Он должен сказать о первом аргументе функции: , если true, тогда возвращается текущий активный пользовательский интерфейс. Я правильно читаю это? Поведение, которое я наблюдаю, похоже, соответствует другому случаю: , если false, тогда возвращается последний активный вид, независимо от того, активен ли этот вид в настоящее время.

Я могу определить другой способ привязки команд к представлениям, а именно путем подключения к созданию представления. Меня беспокоит то, что я, по-видимому, не могу обработать команду в рекомендованном Microsoft.

ответ

1

Ну, извините за запутанную документацию, но это пошаговое руководство не является чем-то, что я рекомендовал бы для вашего случая (я разработчик в редакции VS).

Как вы отметили, вы можете обрабатывать команды гораздо проще, подключение команд фильтра через IVsTextViewCreationListener, это на самом деле намного больше общего, и лучший способ, см Walkthrough: Using a Shortcut Key with an Editor Extension (что тоже своего рода запутанным название :()

+0

Спасибо, это было то, что я закончил делать. – kkm

2

В ответ от разработчика на команду редактора VS для использования другого метода может работать для человека, который задал оригинальный вопрос, но для нас, кто хочет использовать GetActiveView по другим причинам, остается вопрос: как получить только текстовые окна с фокусом, а чем последнее текстовое окно с фокусом? Недостоверная документация (которая предполагает, что mustHaveFocus является логической, даже если она является int), кажется, вводит в заблуждение, так как установка значения на 0 или 1 (или -1), как представляется, приводит к последнему текстовое окно w с возвратом фокуса.

+0

string GetSelection() { EnvDTE.DTE app = (EnvDTE.DTE) GetService (typeof (SDTE)); if ((app.ActiveDocument! = Null) && (app.ActiveDocument.Type == "Текст")) { EnvDTE.TextDocument textDoc = (EnvDTE.TextDocument) app.ActiveDocument.Object (String.Empty); если (! ТекстDoc.Selection.IsEmpty) { возвращение текстDoc.выбор.Текст; } прочее возвращение «Пустой выбор»; } возвращение «Не текстовый документ»; } – MJW

+0

Вы можете игнорировать предыдущий комментарий. Я пытался показать альтернативный подход, используя вызовы DTE. По-видимому, все еще не было известно, какое окно было активным окном, и с ошибкой Invalid Argument, когда окно VS Property было активным и (app.ActiveDocument! = Null) выполнено. – MJW

 Смежные вопросы

  • Нет связанных вопросов^_^