Китай |
Интерфейс времени проектирования для компонента
Добавление к компоненту пиктограммы
Мы добавили атрибут [ToolboxBitmap(typeof(GradientLabel))] уровня класса для присоединения пиктограммы компонента на этапе проектирования. Теперь нужно подготовить саму пиктограмму и настроить ее так, чтобы она размещалась в сборке компонента. Использованная перегрузка конструктора атрибута требует, чтобы файл рисунка имел формат BMP, имел имя, совпадающее с именем компонента, и значился для оболочки как внедряемый ( embedded ) ресурс.
- Вызовите в проводнике решений контекстное меню для узла MyControl компонента и добавьте к проекту новый рисунок командой Add/New Item с именем компонента GradientLabel.bmp
Оболочка откроет окно графического редактора, в котором нужно будет нарисовать пиктограмму компонента размером 16x16 пикселов.
- При выделенном шаблоне рисования установите в панели Properties размер рисунка 16x16
- Нарисуйте пиктограмму компонента, например, такую
- Сохраните рисунок, закройте окно графического редактора, в проводнике решений выделите файл рисунка и через панель свойств настройте его в соответствии со снимком как внедряемый ресурс с копированием при обновлении
- В панели проводника решений вызовите контекстное меню для узла компонента MyControl и выполните команду Rebuild
- Откройте в проекте Test на редактирование в режиме View Designer форму Form1.cs и убедитесь, что в дежурной вкладке MyControl Components появился компонент GradientLabel с пиктограммой по умолчанию
- В панели Toolbox вызовите контекстное меню для компонента GradientLabel и командой Choose Items откройте окно добавления ссылок на динамические библиотеки с компонентами. Кнопкой Browse вызовите диалог открытия файла и подключите библиотеку MyControl.dll, расположенную в каталоге проекта C:\Tmp\MySolution\MyControl\bin\Debug, а библиотеку из каталога C:\Tmp\MySolution\MyControl\obj\Debug отключите
После выполнения указанных действий в панели Toolbox будет представлен наш компонент с собственной пиктограммой и всплывающей подсказкой, которые мы прикрепили к нему ранее соответствующими атрибутами
- Перенесите компонент на форму Form1, выделите экземпляр компонента GradientLabel и убедитесь через панель Properties в наличие добавленных соответствующими атрибутами настроек
Добавление к компоненту класса дизайнера
Дополнительные возможности по редактированию компонентов в режиме проектирования, в том числе смарт-теги, реализуются с помощью классов дизайнеров. Эти классы обеспечивают связь компонента на этапе разработки с редактором свойств, формой и другими панелями оболочки. Они находятся в сборке System.Design.dll и распределены по пространствам имен
System.ComponentModel.Design System.Windows.Forms.Design
Подключим к проекту MyControl компонента сборку и упомянутые пространства имен с классами дизайнеров.
- В панели Solution Explorer вызовите контекстное меню для узла References проекта MyControl, выполните команду Add Reference и выберите в списке сборку System.Design
Для того, чтобы четко разделить функциональность компонента на этапе проектирования и на этапе выполнения, будем размещать код этапа проектирования в отдельном файле и подключать его к компоненту одной инструкцией-атрибутом.
- В панели проводника решений Solution Explorer вызовите контекстное меню для узла MyControl проекта компонента и командой Add/Class добавьте к проекту компонента новый файл с именем GradientLabelDesigner.cs
- Модифицируйте заготовку файла GradientLabelDesigner.cs следующим образом
using System; using System.ComponentModel; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; using System.ComponentModel.Design; using System.Windows.Forms.Design; namespace MyControl { // Класс-дизайнер компонента internal partial class GradientLabelDesigner : ControlDesigner { } }Листинг 36.7. Начальная заготовка файла с классом дизайнера
Созданный класс-дизайнер GradientLabelDesigner нужно привязать к классу GradientLabel компонента с помощью атрибута Designer.
- Дополните в файле GradientLabel.cs блок кода №2 класса компонента GradientLabel следующим атрибутом привязки класса-дизайнера GradientLabelDesigner
///////////////////////////////////////////////////////////////// // Блок кода №2 продолжения класса GradientLabel ///////////////////////////////////////////////////////////////// namespace MyControl { // Всплывающая подсказка компонента в панели Toolbox [Description("Текстовая метка с градиентной заливкой фона")] // Подключение пиктограммы компонента для панели Toolbox [ToolboxBitmap(typeof(GradientLabel))] // Подключение класса дизайнера к классу компонента [Designer(typeof(GradientLabelDesigner))] partial class GradientLabel { // Закрытые поля private Color startColor = Color.Yellow; private Color endColor = Color.Red; .............................................. } }Листинг 36.8. Код подключения класса дизайнера к компоненту в файле GradientLabel.cs
Теперь можно разрабатывать дополнительные возможности поведения компонента на этапе проектирования, размещая соответствующий код в классе дизайнера GradientLabelDesigner и не смешивая интерфейсный код с функциональным кодом самого компонента GradientLabel.