Главная » C#, Компоненты » Виртуальные свойства

0

В предыдущем разделе мы удаляли свойство из списка свойств. Было бы логично разобраться с тем, как добавлять свойства в этот список, т. е. создавать дополнительные свойства компонента, которые существуют только в режиме разработки. Посмотрите, например, на свойства группы Design (рис. 6.8). Свойства GenerateMember, Locked являются виртуальными. Реально у компонента GradientLabel таких свойств нет.

Рис. 6.8. компонента

Для того чтобы добавить свойство, существующее только в режиме разработки, нужно добавить его В словарь properties В методе PreFilterProperties (), асамо свойство будет существовать только в классе дизайнера:

class GradientLabelDesigner : ControlDesigner

}

int virtualProp;

(DesignerSerializationVisibility(

DesignerSerializationVisibility.Hidden)} [0езсг1рЫоп("Виртуальное свойство") ] public int VirtualProp

1

get ( return virtualProp; } set { virtualProp = value; }

1

1

Как я уже говорил, словарь properties представляет србой связь между именем свойства и его дескриптором, т. е. для добавления свойства нам потребуется дескриптор. Получить его можно двумя способами. Первый— создать дескриптор С ПОМОЩЬЮ метода CreateProperty () класса TypeDescriptor:

PropertyDescriptor descr – TypeDescriptor.CreateProperty(

base.GetType(), "VirtualProp", typeof(int), new Attribute[0]);

Первый параметр передает тип класса, к которому будет добавлен метод, второй— имя метода, третий — тип и четвертый задает атрибуты. Недостаток этого способа именно в отсутствии атрибутов. Перечислять необходимые атрибуты вручную довольно затруднительно, поэтому лучше пойти другим путем и копировать атрибуты существующего свойства:

PropertyDescriptor oldDescr =

TypeDescriptor.GetProperties(this)["VirtualProp"]; Attribute [] attributes = new Attribute [descr.Attributes.Count]; descr.Attributes.CopyTo(attributes, 0);

PropertyDescriptor descr = TypeDescriptor.CreateProperty ( base.GetType(), descr, attributes);

После этого можно добавить его в свойства компонента:

properties["VirtualProp"] = descr;

Очень важно, чтобы виртуальное свойство имело атрибут

DesignerSerializationVisibility. Hidden (см. разд. 10.4), Т. К. иначе ОНО попадет в свойства режима выполнения.

Полный код дизайнера, добавляющего виртуальное свойство, приведен в листинге 6.9.

Еще раз к вопросу о виртуальных свойствах я вернусь в разд. 7.18. Листинг 6.9. Добавление виртуального сыоисгна VirtualProp

using System;

using System.Collections;

using System.Collect ions.Generic;

using System.Text;

using System.Windows.Forms.Design;

using System.Drawing;

using System.ComponentModel;

using System.Windows.Forms;

namespace MyControl {

class GradientLabelDesigner : ControlDesigner [

int virtualProp;

[DesignerSerializationVisibility(

DesignerSerializationVisibilitу.Hidden)] [0езсг1р^оп("Виртуальное свойство") ] public int VirtualProp

{

get ( return virtualProp; ) set { virtualProp = value; )

}

protected override void PreFilterProperties(IDictionary properties)

{

base.PreFilterProperties(properties);

// Берем существующее свойство PropertyDescriptor oldDescr =

TypeDescriptor.GetProperties(this)["VirtualProp"]; // Копируем его атрибуты Attribute[] attributes =

new Attribute[oldDescr.Attributes.Count]; oldDescr.Attributes.CopyTo(attributes, 0); // Создаем новое свойство PropertyDescriptor descr =

TypeDescriptor.CreateProperty(

base.GetType(), oldDescr, attributes); // Добавляем его в свойства компонента properties["VirtualProp"] = descr;

}

}

}

Литература:

Агуров П. В. C#. Разработка компонентов в MS Visual Studio 2005/2008. – СПб.: БХВ-Петербург, 2008. — 480 е.: ил.

По теме:

  • Комментарии