Фильтрация метаданных
Обновлен: Ноябрь 2007
Фильтрация метаданных позволяет конструктору изменять набор свойств, атрибутов и событий, предоставляемых компонентом или элементом управления во время разработки.
Например, элемент управления Control имеет свойство Visible, которое определяет, является ли данный элемент видимым. Однако во время разработки элемент управления должен оставаться видимым всегда вне зависимости от значения данного свойства, поскольку разработчик должен иметь возможность расположить его на рабочей области конструирования. Во время разработки конструктор элемента управления Control замещает свойство Visible своим собственным значением, а позднее восстанавливает значение данного свойства, используемое при выполнении программы.
Для осуществления фильтрации метаданных конструктор может либо реализовать интерфейс IDesignerFilter, либо добавить к поставщику служб, используемых во время разработки, реализацию ITypeDescriptorFilterService, позволяющую осуществлять фильтрацию метаданных для любого компонента в среде разработки.
При выборе компонента во время разработки обозреватель свойств запрашивает у компонента его атрибуты, события и свойства, используя для этого методы TypeDescriptor. Когда во время разработки у компонента запрашиваются атрибуты, события и свойства, любому конструктору компонента, реализующему интерфейс IDesignerFilter, предоставляется возможность изменить набор атрибутов, событий и свойств, возвращаемых компонентом. Затем вызываются методы активных интерфейсов ITypeDescriptorFilterService, чтобы позволить службе выполнять различную фильтрацию атрибутов, событий и свойств.
В режиме конструктора атрибуты, события и свойства обычно запрашиваются у компонента, когда для компонента вызывается принадлежащий TypeDescriptor метод Refresh, а также при обновлении окна "Свойства", при установке (или повторной установке) режима конструктора или при установке главного выделения. Методы других объектов или среды разработки могут вызывать принадлежащие TypeDescriptor методы в другие моменты времени.
Интерфейс IDesignerFilter для фильтрации метаданных компонента
Интерфейс IDesignerFilter определяет набор методов, которые можно переопределить и реализовать в конструкторе для изменения свойств, событий или атрибутов, предоставляемых управляемым конструктором компонентом во время разработки.
Каждый метод интерфейса IDesignerFilter имеет префикс "Pre" или "Post". Ко всем методам добавляется суффикс "Attributes", "Events" или "Properties", в зависимости от того, какой тип члена он позволяет добавлять, изменять или удалять. Чтобы добавлять атрибуты, события или свойства, следует использовать соответствующий метод, имя которого начинается с "Pre". Чтобы изменять или удалять атрибуты, события или свойства, нужно применять соответствующий метод, имя которого начинается с "Post". Методы с именем, начинающимся с "Pre", вызываются непосредственно перед методами, начинающимися с "Post".
Чтобы добавить атрибут или атрибуты, следует реализовать переопределение метода PreFilterAttributes, добавляющего новый атрибут System.Attribute к передаваемому данному методу интерфейсу IDictionary. Ключами в словаре являются идентификаторы типов атрибутов. Чтобы изменить или удалить атрибут или атрибуты, следует реализовать переопределение метода PostFilterAttributes.
Чтобы добавить событие или события, следует реализовать переопределение метода PreFilterEvents, добавляющего новый дескриптор EventDescriptor к передаваемому данному методу словарю IDictionary. Ключи в словаре являются именами событий. Чтобы изменить или удалить событие или события, следует реализовать переопределение метода PostFilterEvents.
Чтобы добавить свойство или свойства, следует реализовать переопределение метода PreFilterProperties, добавляющего новый дескриптор PropertyDescriptor к передаваемому данному методу словарю IDictionary. Ключи в словаре являются именами свойств. Чтобы изменить или удалить свойство или свойства, следует реализовать переопределение метода PostFilterProperties.
Примечание. |
---|
При расширении классом возможностей конструктора, реализующего интерфейс IDesignerFilter, каждый метод PostИмяМетода после изменения собственных атрибутов должен вызывать соответствующий метод PostИмяМетода базового класса, а каждый метод PreИмяМетода перед изменением собственных атрибутов должен вызывать соответствующий метод PreИмяМетода базового класса. |
В следующем примере кода показываются сигнатуры метода интерфейса IDesignerFilter:
Public Interface IDesignerFilter
Sub PostFilterAttributes(attributes As IDictionary)
Sub PostFilterEvents(events As IDictionary)
Sub PostFilterProperties(properties As IDictionary)
Sub PreFilterAttributes(attributes As IDictionary)
Sub PreFilterEvents(events As IDictionary)
Sub PreFilterProperties(properties As IDictionary)
End Interface
public interface IDesignerFilter {
void PostFilterAttributes(IDictionary attributes);
void PostFilterEvents(IDictionary events);
void PostFilterProperties(IDictionary properties);
void PreFilterAttributes(IDictionary attributes);
void PreFilterEvents(IDictionary events);
void PreFilterProperties(IDictionary properties);
}
В следующем примере кода демонстрируется реализация интерфейса IDesignerFilter, добавляющего свойство Color конструктора к связанному с ним компоненту:
Imports System
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
Namespace IDesignerFilterSample
_
Public Class DesignerFilterDesigner
Inherits ComponentDesigner
' Designer color property to add to component.
Public Property TestColor() As Color
Get
Return Me.intcolor
End Get
Set(ByVal Value As Color)
Me.intcolor = Value
End Set
End Property
' Color for TestColor property.
Private intcolor As Color = Color.Azure
Public Function DesignerFilterDesigner()
End Function 'DesignerFilterDesigner
' Adds a color property of this designer to the component.
Protected Overrides Sub PreFilterProperties(ByVal properties As System.Collections.IDictionary)
MyBase.PreFilterProperties(properties)
' Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(GetType(DesignerFilterDesigner), "TestColor", GetType(System.Drawing.Color), Nothing))
End Sub 'PreFilterProperties
End Class 'DesignerFilterDesigner
' Component with which the DesignerFilterDesigner is associated.
<Designer(GetType(DesignerFilterDesigner))> _
Public Class TestComponent
Inherits Component
Public Function TestComponent()
End Function 'TestComponent
End Class 'TestComponent
End Namespace
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;
namespace IDesignerFilterSample
{
public class DesignerFilterDesigner : ComponentDesigner, IDesignerFilter
{
// Designer color property to add to component.
public Color TestColor
{
get
{ return this.intcolor; }
set
{ this.intcolor = value; }
}
// Color for TestColor property.
private Color intcolor = Color.Azure;
public DesignerFilterDesigner()
{}
// Adds a color property of this designer to the component.
protected override void PreFilterProperties(System.Collections.IDictionary properties)
{
base.PreFilterProperties(properties);
// Adds a test property to the component.
properties.Add("TestColor", TypeDescriptor.CreateProperty(typeof(DesignerFilterDesigner), "TestColor", typeof(System.Drawing.Color), null));
}
}
// Component with which the DesignerFilterDesigner is associated.
[Designer(typeof(DesignerFilterDesigner))]
public class TestComponent : Component
{
public TestComponent()
{}
}
}
Пример конструктора элементов управления Windows Forms, реализующего фильтрацию свойств с помощью интерфейса IDesignerFilter, см. в разделе Пример конструктора Windows Forms.
Служба ITypeDescriptorFilterService для глобальной фильтрации метаданных в режиме конструктора
Фильтрация метаданных компонентов в режиме разработки проекта обеспечивается путем добавления реализации службы ITypeDescriptorFilterService к поставщику, предоставляющему службы во время разработки, для чего используется метод AddService интерфейса IServiceContainer, реализованного через интерфейс ISite, возвращаемый свойством Site компонента Component, находящегося в режиме конструктора.
В следующем примере кода показано добавление службы ITypeDescriptorFilterService с именем ExampleFilterService:
IDesignerHost dh = (IDesignerHost)this.Component.GetService(typeof(IDesignerHost));
if( dh != null )
{
// First gets any previous ITypeDescriptorFilterService to replace when
// the current service is removed, and to call if the new service
// implements service chaining.
ITypeDescriptorFilterService itdfs =
(ITypeDescriptorFilterService)dh.GetService( typeof(ITypeDescriptorFilterService));
oldService = (ITypeDescriptorFilterService)dh.GetService(
typeof(ITypeDescriptorFilterService));
if(oldService != null)
// Removes any old ITypeDescriptorFilterService.
dh.RemoveService(typeof(ITypeDescriptorFilterService));
// Adds an ExampleFilterService that implements service chaining.
dh.AddService(typeof(ITypeDescriptorFilterService),
new ExampleFilterService(oldService));
}
Пример реализации ITypeDescriptorFilterService см. в справочной документации по классу ITypeDescriptorFilterService.
См. также
Задачи
Практическое руководство. Настройка атрибутов, событий и свойств компонента в режиме конструктора
Основные понятия
Практическое руководство. Реализация конструктора для элемента управления
Общие сведения о дескрипторах типов