メタデータ フィルタ処理
メタデータ フィルタ処理によって、デザイナは、デザイン時にコンポーネントやコントロールによって公開されるプロパティ、属性、およびイベントのセットを変更できます。
たとえば、Control には、コントロールを表示するかどうかを指定する Visible というプロパティがあります。ただし、デザイン時には、開発者がデザイン サーフェイスにコントロールを配置できるように、このプロパティの値に関係なくコントロールが表示された方が便利です。Control のデザイナは、デザイン時に Visible プロパティをデザイナ独自のプロパティに置き換え、デザイン完了後にこのプロパティの実行時の値を復元します。
メタデータ フィルタ処理を実行するために、デザイナは IDesignerFilter インターフェイスを実装するか、またはデザイン時サービス プロバイダに、デザイン時環境ですべてのコンポーネントに対してメタデータ フィルタ処理を実行できる ITypeDescriptorFilterService の実装を追加できます。
デザイン時にコンポーネントを選択すると、プロパティ ブラウザは TypeDescriptor のメソッドを使って、コンポーネントに属性、イベント、およびプロパティを照会します。デザイン モードでコンポーネントに属性、イベント、およびプロパティを照会する場合、IDesignerFilter インターフェイスを実装する、コンポーネントのデザイナはコンポーネントによって返される属性、イベント、およびプロパティのセットを変更できます。次に、アクティブな ITypeDescriptorFilterService のメソッドが呼び出され、サービスは属性、イベント、およびプロパティのフィルタ処理を実行できるようになります。
デザイン モードのコンポーネントの属性、イベント、およびプロパティが照会されるのは、通常、コンポーネントの TypeDescriptor の Refresh メソッドが呼び出されたとき、[プロパティ] ウィンドウが更新されたとき、デザイン モードが確立または再確立されたとき、および第 1 の選択が設定されたときです。他のオブジェクトのメソッドやデザイン時環境では、TypeDescriptor のメソッドが呼び出される場合もあります。
コンポーネントのメタデータ フィルタ処理のための IDesignerFilter インターフェイス
IDesignerFilter インターフェイスは、デザイナでオーバーライドおよび実装することによって、デザイン時にデザイナで管理されるコンポーネントが公開するプロパティ、イベント、または属性を変更できるメソッドのセットを定義します。
IDesignerFilter インターフェイスの各メソッドの名前には、"Pre" または "Post" のいずれかのプリフィックスが付きます。また、各メソッドの名前には、追加、変更、または削除できるメンバの種類に応じて、"Attributes"、"Events"、または "Properties" のいずれかのサフィックスが付きます。属性、イベント、またはプロパティを追加するには、名前が "Pre" で始まる関連するメソッドを使用します。属性、イベント、またはプロパティを変更または削除するには、名前が "Post" で始まる関連するメソッドを使用します。名前が "Pre" で始まるメソッドは、名前が "Post" で始まるメソッドの直前に呼び出されます。
属性を追加する場合は、メソッドに渡される IDictionary に新しい System.Attribute を追加する PreFilterAttributes メソッドのオーバーライドを実装します。ディクショナリ内のキーは属性の型 ID です。属性を変更または削除するには、PostFilterAttributes メソッドのオーバーライドを実装します。
イベントを追加する場合は、メソッドに渡される IDictionary に新しい EventDescriptor を追加する PreFilterEvents メソッドのオーバーライドを実装します。ディクショナリ内のキーはイベントの名前です。イベントを変更または削除するには、PostFilterEvents メソッドのオーバーライドを実装します。
プロパティを追加する場合は、メソッドに渡される IDictionary に新しい PropertyDescriptor を追加する PreFilterProperties メソッドのオーバーライドを実装します。ディクショナリ内のキーはプロパティの名前です。プロパティを変更または削除するには、PostFilterProperties メソッドのオーバーライドを実装します。
注意
IDesignerFilter を実装するデザイナをクラスが拡張するときには、各 PostMethodName メソッドがその属性を変更した後で、基本クラスの対応する PostMethodName メソッドを呼び出す必要があります。また、各 PreMethodName メソッドがその属性を変更する前に、基本クラスの対応する PreMethodName メソッドを呼び出す必要もあります。
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);
}
デザイナの Color
プロパティを、関連付けられたコンポーネントに追加する IDesignerFilter の実装を次のコード例に示します。
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()
{}
}
}
IDesignerFilter インターフェイスを使用してプロパティのフィルタ処理を実装した Windows フォーム コントロール デザイナの例については、「Windows フォーム デザイナのサンプル」を参照してください。
グローバル デザイン モードのメタデータ フィルタ処理のための ITypeDescriptorFilterService
デザイン時プロジェクトの任意のコンポーネントにメタデータ フィルタ処理を提供するには、デザイン時にサービスを提供するサービス プロバイダに ITypeDescriptorFilterService の実装を追加し、デザイン モードで配置した Component の Site プロパティで返される ISite によって実装される IServiceContainer インターフェイスの AddService メソッドを使用します。
ExampleFilterService
という名前の ITypeDescriptorFilterService サービスを追加する方法を次のコード例に示します。
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 クラスのリファレンス ドキュメントを参照してください。
参照
処理手順
方法 : デザイン モードでコンポーネントの属性、イベント、およびプロパティを調整する
概念
基本デザイナ クラス
デザイナ動詞
方法 : コントロール用デザイナを実装する
型記述子の概要