Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 36:

Интерфейс времени проектирования для компонента

Добавление к компоненту пиктограммы

Мы добавили атрибут [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.

Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000