Поскольку вы хотите, чтобы окно инструмента создавалось и отображалось после загрузки надстройки, то вызов метода CreateToolWindow2 надо поместить в метод Connect. OnConnection. Сначала вы настраиваете локальный объект, чтобы он указывал на коллекцию DTE. ToolWindows:
II Коллекция DTE.ToolWindows
Windows2 toolWindows= (Windows2)_applicationObject.Windows;
Затем вам нужен объект, в котором будет храниться ссылка на создаваемое вами окно инструмента:
// Объект для ссылки на создаваемое окно инструмента Window2 toolWindow;
И наконец, вам нужно создать параметры, необходимые для метода CreateToolWindow2:
// Объект указателя места заполнения; в конечном итоге будет ссылаться //на пользовательский элемент управления object paletteObject = null;
// Данный раздел указывает путь и имя класса для элемента управления // "палитра", который будет находиться в новом окне инструмента;
// нам нужно также указать его заголовок и уникальный GUID.
Assembly asm = System.Reflection.Assembly.GetExecutingAssembly(); string assemblyPath = asm.Location;
string className = "ColorSelectorAddln.PaletteControl"; string guid = M{62175059-FD7E-407a-9EF3-5D07F2B704E8}"; string caption = "Palette Color Picker";
Обратите внимание, что мы жестко закодировали идентификатор GUID для передачи в метод CreateToolWindow2. Поскольку наш пользовательский элемент управления — это элемент управления на управляемом коде и его работа будет обеспечиваться "родным" СОМ- компонентом (все окна инструментов в Visual Studio основаны на СОМ), то инфраструктуре надстройки нужен какой-то способ установить интерфейс вызова для элемента управления. Это делается при помощи использования параметра GUID. Нам также будет нужно "пометить" пользовательский элемент управления идентификатором GU1D (посредством размещения атрибута Guid непосредственно перед объявлением нашего класса PaletteControl):
namespace ColorSelectorAddln {
[Guid("62175059-FD7E-407a-9EF3-5D07F2B704E8")] public partial class PaletteControl : UserControl { ... }
} -
Вы можете использовать Visual Studio для генерирования вашего GUID (при помощи выбора меню Tools | Create GUID | Registry Format). Вы можете затем напрямую скопировать и вставить это в ваше окно с кодом.
Теперь вы всего лишь в нескольких строках кода от создания и отображения окна инструмента:
// Создать новое окно инструмента с вложенным пользовательским // элементом управления 1
toolWindow = (Window2)toolWindows.CreateToolWindow2(_addlnlnstance,
assemblyPath, className, caption, guid, ref paletteObject);
// Если окно инструмента было создано успешно, сделать его видимым if (toolWindow != null)
{
toolWindow.Visible = true;
}
Перехват событий пользовательских элементов управления <
Надстройке не хватает только одного: вам нужно реагировать на щелчок пользователя по палитре. Для этого надо взять сгенерированный код (доступный через свойство PaletteControl .Code) и вставить его в текущий активный документ. При этом есть две задачи. Сначала вам нужно написать обработчик события, для работы с событием щелчка, генерируемым объектом PaletteControl. Но для этого вам нужна ссылка на пользовательский элемент управления. Это— цель объекта paletteObject, который вы передаете как последний параметр методу CreateToolWindow2. Поскольку он передается по ссылке, то (после завершения метода и возвращения из него) он будет содержать экземпляр PaletteControl. Затем вы можете привести тип этого объекта к типу PaletteControl, присвоить его полю внутри класса Connect и прикрепить обработчик события к событию PaletteControl.ColorSelected:
// Получить ссылку на наш объект пользовательского элемента управления _paletteControl = (PaletteControl)paletteObject;
// Подключить обработчик ошибки для события PaletteControl.ColorSelected _paletteControl.ColorSelected +=
new System.EventHandler(paletteControll_ColorSelected);
Совет
Получить ссылку на пользовательский элемент управления может быть не очень просто. Если пользовательский элемент управления не является частью того же самого проекта, что и класс вашей надстройки, то CreateToolwindow2 возвратит только значение null (вместо ссылки на пользовательский элемент управления). Если вы хотите разработать ваш пользовательский элемент управления вне проекта надстройки, то вы должны убедиться, что пользовательский элемент управления полностью атрибутирован и видим для вызывающих COM-компонентов. Подробности того, как это делается, см. в теме "Exposing .NET Framework Components to COM" документации MSDN.