| Китай |
Интерфейс времени проектирования для компонента
Атрибуты как средство дополнительной настройки компонента
Атрибут, это дополнительный механизм уточнения поведения класса или его члена, относящийся к современным технологиям программирования. Атрибуты - это типы, порожденные абстрактным классом Attribute. Имена всех библиотечных атрибутов заканчиваются словом Attribute, но для простоты язык C# позволяет сокращать запись и указывать название атрибута без этого постфикса (postfix).
Атрибут прикрепляется к объекту с помощью описания конструктора в квадратных скобках, но для атрибутов уровня сборки или модуля прикрепление выполняется с помощью ключевых слов Assembly и Module соответственно.
К объекту могут прикрепляться несколько атрибутов в индивидуальных квадратных скобках или списком в общих квадратных скобках. Например, инструкция прикрепления нескольких атрибутов к классу вот такая
// Всплывающая подсказка компонента в панели Toolbox
[Description("Текстовая метка с градиентной заливкой фона")]
// Подключение пиктограммы компонента для панели Toolbox
[ToolboxBitmap(typeof(GradientLabel))]
// Подключение класса дизайнера к классу компонента
[Designer(typeof(GradientLabelDesigner))]
partial class GradientLabel
{
.........................................
}равносильна такой инструкции
// Всплывающая подсказка компонента в панели Toolbox
[Description("Текстовая метка с градиентной заливкой фона"),
// Подключение пиктограммы компонента для панели Toolbox
ToolboxBitmap(typeof(GradientLabel)),
// Подключение класса дизайнера к классу компонента
Designer(typeof(GradientLabelDesigner))]
partial class GradientLabel
{
.........................................
}Конструктор атрибута может принимать два вида параметров:
- Позиционные параметры - параметры, указанные в конструкторе класса-атрибута и обязательные к упоминанию их первыми в строгом порядке следования
- Именованные параметры - поля и свойства класса-атрибута, которые представляют собой пары 'имя=значение' и которые можно указывать по желанию (можно и не указывать) после позиционных параметров без соблюдения порядка следования. Именованные параметры внутри класса-атрибута должны быть объявлены доступными как для чтения, так и для записи. Параметры, доступные только для чтения, не могут использоваться как именованные.
Различают следующие атрибуты:
- Атрибуты, используемые компилятором
- Атрибуты, используемые средой проектирования
- Атрибуты, используемые библиотекой классов
- Пользовательские атрибуты
В таблице приведены некоторые атрибуты, используемые самой средой проектирования. Они нам понадобятся для настройки поведения компонента в режиме проектирования.
Воспользуемся некоторыми из приведенных атрибутов для частичной настройки нашего компонента GradientLabel. Вспомним, что атрибуты прикрепляются перед объектом влияния по-отдельности в квадратных скобках каждый, либо списком в общих квадратных скобках.
-
Дополните
вторую часть класса компонента в файле GradientLabel.cs атрибутами,
выделенными в следующем листинге
/////////////////////////////////////////////////////////////////
// Блок кода №2 продолжения класса GradientLabel
/////////////////////////////////////////////////////////////////
namespace MyControl
{
// Всплывающая подсказка компонента в панели Toolbox
[Description("Текстовая метка с градиентной заливкой фона")]
// Подключение пиктограммы компонента для панели Toolbox
[ToolboxBitmap(typeof(GradientLabel))]
partial class GradientLabel
{
// Закрытые поля
private Color startColor = Color.Yellow;
private Color endColor = Color.Red;
// Категория свойства в панели Properties
[Category("Gradient")]
// Пояснение для выделенного свойства
// в нижней части панели Properties
[Description("Цвет начала заливки")]
// Значение свойства по умолчанию
[DefaultValue(typeof(Color), "Yellow")]
// Представление имени свойства в панели Properties
// [DisplayName("Начало заливки")]
public Color StartColor // Общедоступное свойство
{
get { return startColor; }
set
{
// Меняем значение
startColor = value;
// Инициируем событие
OnGradientChange(EventArgs.Empty);
}
}
// Альтернативный синтаксис прикрепления атрибутов
[Category("Gradient"), Description("Цвет завершения заливки"),
DefaultValue(typeof(Color), "Red")]
// [DisplayName("End Color")]
public Color EndColor // Общедоступное свойство
{
get { return endColor; }
set
{
// Меняем значение
endColor = value;
// Инициируем событие
OnGradientChange(EventArgs.Empty);
}
}
// Пояснение для выделенного события
// в нижней части панели Properties
[Description("Событие изменения цвета\n"
+ "границ градиентной заливки")]
// Объявление события изменения свойств цвета градиента
public event EventHandler GradientChange;
// Функция диспетчеризации события GradientChange
protected virtual void OnGradientChange(EventArgs args)
{
// Перерисовываем компонент
this.Invalidate();
// Если есть зарегистрированные обработчики,
// то инициируем событие и вызываем обработчики
if (GradientChange != null)
GradientChange(this, args);
}
// Переопределение метода OnPaint()
protected override void OnPaint(PaintEventArgs e)
{
// Контекст графического устройства
Graphics gr = e.Graphics;
// Создаем кисть и заливаем фон текстового блока
float angle = 10.0F;
Brush brush = new LinearGradientBrush(
this.ClientRectangle, startColor, endColor, angle);
gr.FillRectangle(brush, this.ClientRectangle);
// Сразу освобождаем кисть как ограниченный ресурс
brush.Dispose();
// Вызываем после заливки, иначе закрашивается текст
base.OnPaint(e);
}
}
}
Листинг
36.6.
Добавление атрибутов в класс GradientLabel
