Подтвердить что ты не робот

Добавление пользовательских окон редактора в оконные окна Visual Studio

Моя проблема

Я пытаюсь создать расширение для Visual Studio, которое позволяет редактировать код для каждой функции, а не для каждого файла. Я в основном пытаюсь отобразить код аналогично Canvas Microsoft Debugger.

Мне интересно, как размещать несколько редакторов Visual Studio в одном окне (я считаю, что в Windows реализовано IVsWindowFrame). Функцию, которую я за ней, можно увидеть ниже:

Microsoft Debugger Canvas

Каждое окно редактора сохраняет типичную функциональность и взаимодействует с сторонними расширениями, как ожидалось. (Например, VsVim функционирует правильно в этих окнах).

Что я пробовал

Я провел почти две недели, исследуя и пробовал этот материал, и у меня много проблем с выяснением, какие сервисы, интерфейсы и классы я буду использовать.

Чтение через MSDN

Во-первых, большая часть документации обсуждает, как редактировать одиночное окно редактора и добавлять украшения, метки, поля и т.д. t обсуждать возможность появления нескольких редакторов в окне окна.

Я просмотрел документацию на большом количестве интересующих меня интерфейсов, включая IVsTextBuffer, IVsTextView и IVsInvisibleEditor. К сожалению, я не могу заставить некоторые из этих интерфейсов хорошо играть вместе.

В верхней части этого, как правило, превосходная MSDN крайне не хватает в этой области. Многие интерфейсы содержат только список членов, даже без основного замечания о предполагаемом использовании и функциональности. (IComponentModel, например).

Многие интерфейсы ссылаются на набор Примеры редактора, но код не может быть прочитан или загружен на MSDN. По-видимому, он поставляется с Visual Studio 2005, но у меня нет этой версии Visual Studio, и я не могу ее найти.

Взаимодействие с IVsUIShell

Я могу получить доступ ко всем открытым окнам, используя IVsUIShell.GetDocumentWindowEnum(); Я вижу, что существует метод IVsUiShell.CreateDocumentWindow(), но я совершенно не знаком с параметрами, которые он принимает, или если это правильно путь вниз.

Что мне нужно сделать

  • Программно создать прикрепляемую оконную панель
  • Программно добавить редакторов в это окно. (И убедитесь, что они правильно зарегистрированы в Visual Studio, рабочей таблице и т.д.).

Edit:

Извините, я должен был расширить свои шаги. Когда я сказал, что мне нужно зарегистрироваться в рабочей таблице документов и Visual Studio, это потому, что я хочу редактировать исходный документ в своем настраиваемом редакторе. Ниже приведен краткий пример функциональности, доступной в Canvas отладчика, которую я пытаюсь воссоздать:

http://i.imgur.com/aYm8A5E.gif (я не могу вставить .gif)

В качестве альтернативы:

Если кто-нибудь знает, где я могу найти образцы редактора, включенные в Visual Studio 2005, например Пример основного редактора, я уверен, что смогу Извлеките это. В документации MSDN нет образцов кода, касающихся этих интерфейсов, что затруднило мою работу.

4b9b3361

Ответ 1

Git Поставщик контроля источника - это расширение с открытым исходным кодом, включающее панель инструментов, которая встраивает стандартный редактор в качестве элемента управления в пользовательский WPF окно инструмента. Я бы использовал этот код в качестве ссылки для любого расширения Visual Studio 2010+, где я хотел разместить окно редактора в каком-то настраиваемом месте.

  • PendingChangesView.xaml включает в себя ContentControl с именем DiffEditor, содержимое которого будет редактором.
  • PendingChangesView.xaml.cs включает метод ShowFile, который вызывает метод для создания элемента управления редактором и присваивает результат как содержимое DiffEditor.
  • ToolWindowWithEditor.cs включает метод SetDisplayedFile, который возвращает интерфейс Tuple<Control, IVsTextView>, который обеспечивает доступ к Control, который может быть добавлен в ContentControl, а также IVsTextView для текстового представления. Тяжелый подъем в этом методе.

Обратите внимание, что метод SetDisplayedFile включает несколько строк со следующей формой:

textViewHost.TextView.Options.SetOptionValue({name}, {value});

Эти строки выполняют ключевые функции для поставщика контроля источника Git, такие как удаление полей и создание окна только для чтения. Существует много вариантов, поэтому вы захотите просмотреть документацию для DefaultTextViewOptions и DefaultTextViewHostOptions, чтобы применить те, которые подходят для вашего конкретного расширения.

Ответ 2

Я действительно не посмотрел файлы, которые @280Z28 (почему это имя пользователя?) отправлено. Я работал над редактором Visual Studio, и то, что вы пытаетесь сделать, имеет несколько аспектов, которые вы должны решать самостоятельно:

  • Хостинг нескольких целевых команд внутри одного окна IVsWindowFrame (это означает, что у вас будут разные элементы внутри одной панели с точки зрения оболочки Visual Studio, и каждый из них должен иметь свою собственную обработку команд. Рассмотрим случай где вы помещаете свою каретку в один из мини-редакторов и хотите отменить использование Ctrl + Z, спустя несколько секунд вы поместите свою каретку в другой мини-редактор и сделайте то же самое. Хотя фокус WPF и Win32 остались внутри тот же оконный кадр (с точки зрения оболочки Visual Studio), команды должны быть перенаправлены на разные компоненты.
  • Использование редактора, отображающего части другого документа. Механизмы здесь, которые будут вашим другом, находятся в пространстве имен проекций. Проецирование по существу позволяет проецировать кусок буфера (или буфера) в представление. Буферы эллипса - это специальные буферы для проекций, которые проектируются из одного исходного буфера в целевой вид, скрывая области буфера (это, скорее всего, то, что вы хотите). Пример буфера проекции - это то, что происходит внутри файла cshtml. В этом случае есть один буфер, содержащий все код С#, один буфер, содержащий все javascript, и один буфер, содержащий html, и каждый компилятор работает с этого буфера, но конечный пользователь видит проекцию всех этих буферов в редактор просмотр с отображением только соответствующих частей (например, операторы импорта С# удаляются, хотя они существуют в реальном буфере С#.)
  • Управление запущенным документом, чтобы при редактировании в мини-редакторе реальный документ был загрязнен. Вам необходимо обрабатывать случаи, когда родительский файл уже открыт в RDT, и в этом случае вы хотите загрязнить один и тот же документ при внесении изменений, а также случаи, когда документ не открыт, и в этом случае вам нужно создать новую запись в RDT.

Кроме того, отправьте сообщение на форумы Visual Studio, есть люди, которые регулярно проверяют форумы и направляют вопросы соответствующим разработчикам.

Вообще говоря, когда дело доходит до редактора, избегайте любых традиционных интерфейсов (ничего, что не использует MEF), поэтому образцы из Visual Studio 2005 не должны использоваться в качестве контрольной точки.

Если вы заботитесь о себе и находитесь в Сиэтле, вы можете попытаться отправиться в университетский городок в качестве MVP. Есть дни, когда вы приходите в университетский городок, а члены разной команды хватают ноутбук и заходят в ваш конференц-зал, и вы можете отлаживать код вместе или взламывать (имея доступ к отладке символов, а что нет).

И последнее, но не менее важное: свяжитесь с canvas canvas, я уверен, что они решили многие из проблем, с которыми вы столкнулись.

Ответ 3

Вам необходимо зарегистрировать окно инструмента с расширением вашего пакета; это можно сделать с помощью атрибута ProvideToolWindow. Следующая статья содержит всю необходимую информацию о том, как редактор может размещаться в окне инструмента: http://bit.ly/9VWxPR

Взгляните на класс WpfTextViewHost; в статье объясняется, что этот тип на самом деле является UIElement, поэтому я предполагаю, что он может размещать несколько экземпляров его...