共用方式為


中繼資料篩選

更新:2007 年 11 月

中繼資料篩選允許設計工具修改元件或控制項在設計階段公開的屬性 (Property)、屬性 (Attribute) 和事件集合。

例如,Control 具有一項名為 Visible 的屬性,該屬性可決定是否顯示控制項。然而在設計階段中,不論這個屬性的值為何,控制項應該一直保持可見,以便開發人員能夠在設計介面上將之定位。Control 的設計工具在設計階段中以它自己的版本取代 Visible 屬性,而事後再還原這個屬性的執行階段值。

如果要執行中繼資料篩選,設計工具可以實作 IDesignerFilter 介面或將 ITypeDescriptorFilterService 實作加入至能在設計階段環境中的任何元件上,執行中繼資料篩選的設計階段服務提供者。

在設計階段選取元件時,屬性瀏覽器會透過 TypeDescriptor 的方法查詢元件的屬性 (Attributes)、事件和屬性 (Property)。在設計模式中查詢元件的屬性 (Attribute)、事件和屬性 (Property) 時,該元件的任何實作 IDesignerFilter 介面之設計工具,都有機會修改元件所傳回的屬性 (Attribute)、事件和屬性 (Property) 集合。接著會呼叫任何作用中 ITypeDescriptorFilterService 的方法,讓服務執行任何的屬性 (Attribute)、事件和屬性 (Property) 篩選。

在元件上呼叫 TypeDescriptorRefresh 方法時、重新整理 [屬性] 視窗時、建立或重新建立設計模式時,以及設定主要選取時,通常會查詢設計模式中元件的屬性 (Attribute)、事件和屬性 (Property)。其他物件的方法或設計階段環境可以在其他時間呼叫 TypeDescriptor 的方法。

元件中繼資料篩選的 IDesignerFilter 介面

您可以在設計工具中覆寫或實作 IDesignerFilter 介面定義的方法集合,以改變設計工具管理的元件在設計階段所公開的屬性 (Property)、事件或屬性 (Attribute)。

IDesignerFilter 介面的每一個方法的前置詞是 "Pre" 或 "Post"。每一個方法的尾碼是 "Attributes"、"Events" 或 "Properties",視它允許您加入、變更或移除的成員型別而定。若要加入任何屬性 (Attribute)、事件或屬性 (Property),請使用名稱前置詞是 "Pre" 的相關方法。若要變更或移除任何屬性 (Attribute)、事件或屬性 (Property),請使用名稱前置詞是 "Post" 的相關方法。呼叫名稱前置詞是 "Post" 的相關方法之前,會先呼叫名稱前置詞是 "Pre" 的相關方法。

若要加入一或多個屬性 (Attribute),請實作 PreFilterAttributes 方法的覆寫,以便將新的 System.Attribute 加入至已傳給該方法的 IDictionary。字典中的索引鍵是屬性 (Attribute) 的型別 ID。如果要變更或移除一或多個屬性 (Attribute),請實作 PostFilterAttributes 方法的覆寫。

若要加入一或多個事件,請實作 PreFilterEvents 方法的覆寫,以便將新的 EventDescriptor 加入至已傳給該方法的 IDictionary。字典中的索引鍵是事件名稱。如果要變更或移除一或多個事件,請實作 PostFilterEvents 方法的覆寫。

若要加入一或多個屬性,請實作 PreFilterProperties 方法的覆寫,以便將新的 PropertyDescriptor 加入至已傳給該方法的 IDictionary。字典中的索引鍵是屬性 (Property) 名稱。如果要變更或移除一或多個屬性 (Property),請實作 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);
}

下列程式碼範例示範將設計工具的 IDesignerFilter 屬性 (Property) 加入至相關元件的 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()
      {}
   }
}

如需使用 IDesignerFilter 介面實作屬性篩選的 Windows Form 控制項設計工具範例,請參閱 Windows Form 設計工具範例

全域設計模式中繼資料篩選的 ITypeDescriptorFilterService

您可以使用 IServiceContainer 介面的 AddService 方法 (由設置在設計模式中之 ComponentSite 屬性所傳回的 ISite 所實作),將 ITypeDescriptorFilterService 實作新增至在設計階段提供服務的服務提供者,以便在設計階段專案中提供任何元件的中繼資料篩選。

下列程式碼範例將示範如何新增名稱為 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 類別的參考文件。

請參閱

工作

HOW TO:在設計模式中調整元件的屬性 (Attribute)、事件和屬性 (Property)

概念

基底設計工具類別

設計工具動詞命令

HOW TO:實作控制項的設計工具

型別描述項概觀

其他資源

自訂設計工具