Главная » C#, Компоненты » Добавление и удаление свойств, событий и атрибутов компонентов

0

В разд. 6.6 я показывал, как делать фильтрацию свойств, и событий с помощью методов дизайнера. Те же действия можно выполнить, зарегистрировав дополнительный сервис фильтра HypeDescriptorFilterService. В ОТЛичие от предыдущих сервисов, сервисы фильтров организуют цепочку, последовательно вызывая друг друга. Соответственно, при регистрации сервиса мы должны позаботиться, чтобы новый фильтр вызывал предыдущий. Для этого в переменную oldservice мы сохраним ссылку на предыдущий сервис (листинг 7.17) и будем использовать ее при вызове предыдущего фильтра:

public bool FilterProperties(IComponent component,

IDictionary properties)

}

if (oldService != null) // Вызываем предыдущий фильтр oldservice.FilterProperties(component, properties);

Основное отличие этого кода от использования методов дизайнера заключается в том, что фильтр является "глобальным" фильтром в рамках дизайнера. Другими словами, его методы вызываются для всех компонентов формы. Обратите внимание на проверку, которую приходится делать внутри метода

FilterProperties ():

if (component is GradientLabel)

}

properties.Remove("BackColor");

}

Таким образом, мы удаляем свойство BackColor только для компонента GradientLabel (если помните, мы использовали этот компонент для тестов в главе 6). Если эту проверку убрать, то свойство исчезнет у всех компонентов формы.

С помощью фильтра можно добавлять свойства компонента. Для этого нужно создать дескриптор свойства и вызвать метод Add О (листинг 7.18). Конечно, сначала следует убедиться, что такое свойство еще не было добавлено. Кстати, заметьте, что я добавляю свойство с именем TestProp, которое отражается на свойство Test в дизайнере. Само свойство Test ничего не делает, но с его помощью можно менять свойства компонента, используя метод GetPropertyByName () (см. листинг 7.1). Вообще говоря, сервис позволяет не только добавлять и удалять свойства, но и подменять базовые свойства. Для этого достаточно удалить оригинальное свойство компонента, а затем добавить его, как я описывал ранее.

Листинг 7 17 Добавление фильтра riv**" ‘Чгм-.г i pt orKi lterSf-rvico*

usi.no System;

usiihi System.Collections;

usi no System. Col lections. Generic;

using System.Text;

using System.Windows.Forms.Design; using System.Drawing; using System.ComponentMode1; using System.Windows.Forms; using System.ComponentModel.Design;

namespace MyControl t

class GradientLabeiDesigner : ControlDesigner t

// Хранит ссылку на предьщущий объект сервиса private ITypeDescriptorFilterService oldservice = null;

public override void Initialize(IComponent component)

{

base.Initialize(component); LoadTypeDescriptorFilterService();

}

protected override void PostFilterproperties(IDictionary properties) {

base.PostFilterProperties(properties);

}

// Удаляем сервис при освобождении дизайнера

protected override void Dispose(bool disposing) {

RemoveTypeDescriptorFilterService();

}

// Загрузить MyDesignerFilterService

private void LoadTypeDescriptorFilterService() {

// Сохраняем текущий фильтр ITypeDescriptorFilterService tdfs = (ITypeDescriptorFilterService)

this.Component.Site.GetService{

typeof(ITypeDescriptorFilterService)}; oldservice = tdfs;

// Получаем IDesignerHost для управления сервисами IDesignerHost dh =

(IDesignerHost)this.Component.Site.GetService (

typeof(IDesignerHost));

// Удаляем текущий ITypeDescriptorFilterService dh.RemoveService(typeof(ITypeDescriptorFilterService)); i! Добавляем свой ITypeDescriptorFilterService dh.AddService(typeof(ITypeDescriptorFilterService),

new MyDesignerFilterService(oldservice));

}

// Выгрузить MyDesignerFilterService private void RemoveTypeDescriptorFilterService() t

// Получаем IDesignerHost для управления сервисами IDesignerHost dh = (IDesignerHost)this.GetService(

typeof(IDesignerHost));

// Удаляем свой сервис

dh.RemoveService(typeof(ITypeDescriptorFilterService)); // Если предыдущий существовал, восстанавливаем его if (oldservice != null)

dh.AddService(typeof(ITypeDescriptorFilterService), oldservice);

}

}

public class MyDesignerFilterService : ITypeDescriptorFilterService

{

ITypeDescriptorFilterService oldService = null;

public MyDesignerFilterService(

ITypeDescriptorFilterService oldService)

{

this.oldService = oldService;

}

public bool FilterAttributes(IComponent component,

IDictionary attributes)

{

if (oldService != null)

oldService.FilterAttributes{component, attributes); return true;

1

public bool FilterEvents (iCcrtiponent component, IDictionary events)

{

if (oldService != null)

oldService.FilterEvents{component, events);

// Фильтруем обработчики событий

if (component is GradientLabel)

{

events.Remove("Click");

}

return true;

}

public bool FilterProperties(iComponent component,

IDictionary properties)

{

if (oldService != null)

oldService.FilterProperties(component, properties);

// Фильтруем свойства

if (component is GradientLabel) {

properties.Remove("BackColor");

}

return true;

}

}

}

Листинг 7 18 Добавление свойства

namespace MyControl {

class GradientLabelDesigner : ControlDesigner {

private int test;

public int Test {

get { return test; ) set { test = value; }

public class MyDesignerFilterService : ITypeDescriptorFilterService {

public bool FilterProperties(IComponent component,

IDictionary properties)

t

if (oldService != null)

oldService.FilterProperties(component, properties);

// Фильтруем свойства if (component is GradientLabel) t

properties.Remove("BackColor");

if (properties["TestProp"] — null) {

PropertyDescriptor pd =

TypeDescriptor.CreateProperty(

typeof(GradientLabelDesigner), "Test", typeof(int)); properties.Add("TestProp", pd);

}

}

return true;

}

}

}

Литература:

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

По теме:

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