共用方式為


基底設計工具類別

更新:2007 年 11 月

所有設計工具都會實作 IDesigner 介面,此介面會定義基本設計工具介面方法。.NET Framework 也提供一組基底設計工具類別,對支援特定元件或控制項型別的設計工具很有幫助。

IDesigner 介面

設計工具類別必須實作 IDesigner 介面,如下列程式碼範例所示。

Public Interface IDesigner
   Sub Dispose()
   Sub Initialize(component As IComponent)
   ' Other methods.
   ...
   ReadOnly Property Component() As IComponent
   ' Other properties.
   ...
End Interface
public interface IDesigner {
   void Dispose();
   void Initialize(IComponent component);
   // Other methods.
   ...
   IComponent Component {
        get;
   }
   // Other properties.
   ...
}

定位並初始化設計工具元件而且建立設計工具之後,會呼叫 IDesignerInitialize 方法。您可以覆寫 Initialize 方法來執行應該在元件或設計工具初始設定時發生的動作。您不能取代元件的建構函式初始設定,但可以擴大它或重設它初始化的屬性。IDesignerComponent 屬性是透過這個初始設定方法設定的。若要覆寫這個方法,一定要從 Initialize 方法呼叫 base.Initialize(component)。您可以從它的 Component 屬性存取 IDesigner 的元件。

Component 屬性可提供存取與這個設計工具相關聯的元件。這個屬性是在初次建立設計工具物件並且呼叫它的 Initialize 方法時設定的。元件具有與它相關聯的站台,並且設計工具會利用這個站台從設計工具的主應用程式取得服務。

按兩下元件或控制項時,會呼叫 DoDefaultAction 方法。

您可以覆寫 Verbs 屬性,傳回 DesignerVerbCollection,其中包含用來擴充元件快速鍵功能表之功能表項目時必須要有的物件。

Dispose 方法在這個設計工具物件必須被毀棄時叫用。每當元件要從設計容器移除時,即會呼叫它。

元件的基底設計工具類別

ComponentDesigner 類別會實作 IDesignerIDesignerFilter 介面,另外提供對某些元件的設計工具可能會很實用的方法。

Windows Form 控制項的基底設計工具類別

Windows Form 控制項的基底設計工具類別是 ControlDesigner。這個類別衍生自 ComponentDesigner,它提供能自訂 Windows Form 控制項外觀和行為的其他有用方法。如需 Windows Form 設計工具的範例實作,請參閱 HOW TO:實作控制項的設計工具

DocumentDesigner 類別提供基底設計工具,可擴充支援巢狀控制項並接收捲動訊息之 Control 的設計模式行為,並為它提供根層次的設計模式檢視。如需詳細資訊,請參閱 HOW TO:建立採用設計階段功能的 Windows Form 控制項

ASP.NET 伺服器的基底設計工具類別

ASP.NET 伺服器控制項的基底設計工具類別是 ControlDesigner。這個類別針對自訂設計階段 HTML 的呈現提供基底功能。樣板編輯之類工作的其他基底類別描述於 ASP.NET Web 網頁的設計階段支援之中。

設計階段整合的基底類別

TypeConverter 類別提供基底類別,可供與文字表示之間來回轉換型別。如需型別轉換子的詳細資訊,請參閱 HOW TO:實作型別轉換子產生的型別轉換

UITypeEditor 類別提供可以衍生的基底類別,也可以擴充,以實作設計階段環境的自訂型別編輯器。如需有關實作 UITypeEditor 的詳細資訊,請參閱使用者介面型別編輯器概觀

設計工具外觀和行為的基底類別

Behavior 類別可經過擴充,以開發任何類型的使用者介面行為,包括選取、拖曳和調整大小等行為。繪製及點擊測試 (Hit Testing) 是由 Glyph 類別執行。

如需詳細資訊,請參閱行為服務概觀

設計工具載入器的基底類別

BasicDesignerLoader 類別提供 IDesignerLoaderService 介面的實作。BasicDesignerLoader 是設計工具載入器的完整實作而與頁面保存格式毫無關聯。

CodeDomDesignerLoader 是抽象類別,可根據程式碼文件物件模型 (CodeDOM) 提供完整的設計工具載入器。

設計工具序列化的基底類別

CodeDomSerializerBase 類別提供 CodeDomSerializer 類別的基底類別。CodeDomSerializerBase 類別是用來做為 CodeDomSerializerTypeCodeDomSerializer 類別之間的共用基底。

DesignerSerializationManager 類別提供 IDesignerSerializationManager 介面的實作。

如需詳細資訊,請參閱設計工具序列化概觀

智慧標籤的基底類別

DesignerActionList 類別提供型別的基底類別,定義用來建立智慧標籤面板的項目清單。如需詳細資訊,請參閱 HOW TO:將智慧標籤附加至 Windows Form 元件

自訂配置的基底類別

LayoutEngine 類別提供實作配置引擎的基底類別。TableLayoutPanelFlowLayoutPanel 控制項使用 the LayoutEngine 類別以提供配置行為。如需詳細資訊,請參閱 HOW TO:實作自訂配置引擎

標準設計工具

Windows Software Development Kit (SDK) 提供一組能支援特定元件類型的設計工具。這些設計工具是根據所設計的元件而命名,使用 Designer 字當做後置字元。例如,System.Windows.Forms.Control 類別的設計工具是 System.Windows.Forms.Design.ControlDesigner

通用設計工具功能

從設計工具存取設計階段服務

您可以藉由傳送所要求服務的型別,透過 GetService 方法要求大部分的設計階段服務型別。ComponentComponentDesigner 上有 GetService 方法。IServiceProvider 上也有 GetService 方法,是由在設計模式中所設置 IComponentSite 屬性傳回之 ISite 進行實作。

下列程式碼將示範如何使用 GetService 方法,取得 IDesignerHost 服務介面和 IMenuCommandService

如需詳細資訊,請參閱 HOW TO:存取設計階段服務

下列程式碼示範如何從設計模式服務提供者介面取得服務。

' Obtain an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Obtain an IMenuCommandService service.
Dim mcs As IMenuCommandService = CType(Me.Component.Site.GetService(GetType(IMenuCommandService)), IMenuCommandService)
// Obtain an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Obtain an IMenuCommandService service.
IMenuCommandService mcs = 
(IMenuCommandService)this.Component.Site.GetService(typeof(IMenuCommandService));

從設計工具存取專案元件

設計工具只要存取 IDesignerHost 服務介面中 Container 屬性的 Components 集合,即可取得設計模式文件之內元件的存取權。下列程式碼範例會示範如何存取目前設計模式專案中的元件。

' Obtains an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Gets the components container for the current design-time project.
Dim container As IContainer = host.Container
' The host.Container IContainer contains each IComponent in the project.
// Obtains an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Gets the components container for the current design-time project.
IContainer container = host.Container;
// The host.Container IContainer contains each IComponent in the project.

取得了元件集合的存取權之後,即可使用 TypeDescriptor 方法和 PropertyDescriptor 物件,以識別型別,並設定元件的屬性值。您也可以使用 IDesignerHost 介面的 CreateComponent 方法,建立元件。

擴充設計工具

當您從與設計工具有關聯的元件衍生時,基底類別的設計工具會依照預設與衍生元件產生關聯。您可以藉由套用 DesignerAttribute 屬性,此屬性會指定要與元件產生關聯的設計工具型別,將各種不同的設計工具與元件產生關聯。對於要擁有會擴充基底設計工具之設計工具的衍生元件,這是很常見的。

如需詳細資訊,請參閱 HOW TO:實作控制項的設計工具

若要擴充設計工具

  1. 定義一個衍生自基底設計工具類別的類別。

  2. 您可以透過套用 DesignerAttribute,將新的設計工具類別與元件產生關聯。

下列程式碼範例會定義可擴充 System.Web.UI.Design.WebControls.LabelDesigner 的設計工具,並將它與擴充 System.Web.UI.WebControls.Label 的自訂標籤產生關聯。

Namespace MyControls.Design
   Public Class MyLabelDesigner
      Inherits System.Web.UI.Design.WebControls.LabelDesigner
   End Class
End Namespace
Namespace MyControls
   <Designer(GetType(MyControls.Design.MyLabelDesigner))> _
   Public Class MyLabel
      Inherits System.Web.UI.WebControls.Label
   End Class
End Namespace
namespace MyControls.Design {
    public class MyLabelDesigner : System.Web.UI.Design.WebControls.LabelDesigner {}
}
namespace MyControls {
[Designer(typeof(MyControls.Design.MyLabelDesigner))]
    public class MyLabel : System.Web.UI.WebControls.Label {}
}
注意事項:

如果您是為密封的類別定義設計工具,或者不想要其他類別使用或繼承您的設計工具,則可以將設計工具類別限制於組件內部使用。設計工具主應用程式將仍舊能夠建立您設計工具的執行個體,但它將不會做為公用物件模型。

請參閱

工作

HOW TO:存取設計階段服務

HOW TO:在 Windows Form 中存取設計階段支援

概念

中繼資料篩選

設計工具動詞命令

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

其他資源

自訂設計工具

ASP.NET Web 網頁的設計階段支援