比較 Windows Form 設計工具架構與 WPF 設計工具架構
WPF Designer的架構和 Windows Form 設計工具架構的差異非常大,後者的特色是有 IComponent 介面和 System.ComponentModel 命名空間。 如果您已經為 Windows Form 控制項建立了自訂設計階段實作,就會注意到 WPF Designer的架構比較容易使用和擴充。
WPF Designer的架構保留了 Windows Form 設計工具物件模型中的 TypeConverter 和 TypeDescriptor 類別。 除了上述外,大部分的 WPF Designer架構則不一樣。 如需 Windows Form 設計階段架構的詳細資訊,請參閱擴充設計階段支援。
ComponentModel 架構和 WPF 架構之間的主要差異
WPF Designer架構和 System.ComponentModel 架構之間的差異,摘要說明如下表。
ComponentModel 架構 |
WPF Designer架構 |
---|---|
以 IComponent、IContainer 和 ISite 介面為基礎。 |
以 FrameworkElement 類別為基礎。 |
需藉助主機所提供的執行階段服務。 |
設計工具會以宣告的方式發行最低需求。 |
每一個控制項型別都有一個專用的設計工具型別。 |
控制項型別上可執行不限數目的功能。 |
每一個控制項型別的中繼資料都採用硬式編碼,在控制項編譯時期是固定的。 |
中繼資料部署在另一個組件中,可以由工具加以自訂或取代。 不需要控制項即可更新設計階段中繼資料。 |
IDesignerHost 保留設計工具狀態。 |
EditingContext 類別保留設計工具狀態。 |
會收集服務並與 IServiceContainer 實作共用。 |
EditingContext 類別會保留服務參考。 |
BehaviorService 負責管理鍵盤、滑鼠及命令互動。 |
WPF Designer架構負責管理鍵盤、滑鼠及命令互動。 |
編輯物件模型是由執行階段控制項所組成,並且透過 PropertyDescriptor 類別進行晚期繫結存取。 |
編輯物件模型會提供間接層,以擷取執行階段控制項。 分類編輯器允許在單一 UI 中編輯多個屬性。 |
IComponent 與 FrameworkElement 的比較
WPF 項目衍生自 FrameworkElement 類別,此類別提供 WPF 核心服務和架構層級項目類別之間的連接。
WPF 項目不會實作 IComponent 介面。 這是 WPF Designer為什麼不使用 System.ComponentModel 架構的主要原因之一。 這就表示不能設置 WPF 控制項。 因此,WPF 控制項無法從 System.ComponentModel 設計環境要求設計工具服務。
設計階段服務
System.ComponentModel 架構中的設計工具會從設計環境要求服務。 在 WPF Designer架構中,您不需查詢環境是否有服務便能完成大部分的工作。
在 System.ComponentModel 架構中,設計工具主應用程式中不一定有設計工具服務,這表示自訂設計工具程式碼在呼叫 GetService 方法後,一定要檢查 null 參考。 當服務不存在時,設計工具程式碼必須降低效能但保持正常運作,而在許多情況下,都無法符合這個條件約束。
在 WPF Designer架構中,自訂設計工具會以宣告的方式發行最低需求。 如果主應用程式無法符合合約,就不會載入設計工具。 這樣使得整體實作變得更簡單、穩固。
專用的設計工具型別與低耦合中繼資料
在 System.ComponentModel 架構中,設計工具型別會透過 DesignerAttribute 中繼資料屬性,與其對應的元件相關聯。 這表示此關係是在編譯時期建立的,強制在元件的執行階段與設計階段行為之間,建立硬式編碼相依性。 若要附加另一個設計工具,您必須變更 DesignerAttribute 宣告,並重新編譯元件的程式碼基底 (Code Base)。
在 WPF Designer中,設計工具中繼資料會納入另一個組件中,此中繼資料實體上是從執行階段實作中分離出來的。 能夠這麼做,表示不同的工具針對相同的執行階段型別可以展現完全不同的設計體驗。 如需詳細資訊,請參閱 AttributeTable。
編輯物件模型
在 System.ComponentModel 架構中,自訂設計工具可透過 PropertyDescriptor 類別,以晚期繫結的方式存取控制項。 這項規則不是由設計環境所強制,而且如果開發人員忘了透過 PropertyDescriptor 類別存取控制項,就會產生錯誤 (Bug)。
在 WPF Designer架構中,自訂設計工具會透過編輯物件模型,與執行階段控制項互動。 這個模型提供間接層,可將控制項抽取至模型和檢視中。 這個物件模型不需要透過 PropertyDescriptor 類別存取控制項。
與 ComponentModel 設計工具架構的相似處
編輯內容是 WPF Designer的基礎。 EditingContext 類別會包含設計工具的內容狀態。
編輯內容的概念,與 System.ComponentModel.Design 命名空間中的 IDesignerHost 介面類似。 IDesignerHost 介面會定義其介面中的許多功能,但 EditingContext 類別則只強調資料及行為功能。
編輯內容公開服務的方式,和 IServiceContainer 介面公開的方式類似。 編輯內容支援列舉型別,但是一旦加入服務後,就不支援將服務移除。 如需詳細資訊,請參閱 編輯內容架構。
屬性使用方法的差異
設計工具屬性在 WPF Designer和 Windows Form 架構中具有不同的意義。 下表描述與設計工具相關的屬性使用方法,在這兩個架構之間的差異。
屬性 |
Windows Form 屬性視窗 |
WPF 設計工具屬性視窗和 Expression Blend 屬性偵測器 |
---|---|---|
指定要傳遞至屬性 (Property) 的值,該值會導致屬性取得來自另一個來源的值。 這稱為「環境屬性」(Ambience Property)。 |
N/A |
|
指定屬性或事件是否應該顯示於 [屬性] 視窗中。 |
指定屬性 (Property) 或事件是否應該顯示於 [屬性] 視窗中。 當通常不會顯示的屬性明確設定為 true 時,就會顯示該屬性。 |
|
指定分類的名稱,該分類會在將 PropertyGrid 控制項設定為 [分類] 模式時,以群組方式來顯示屬性或事件。 |
指定分類的名稱,該分類會將屬性以群組方式顯示在 [屬性] 視窗中。 |
|
指定屬性的預設值。 |
針對 CLR 資料類型,指定屬性的預設值。 在相依性屬性上會被忽略。 |
|
指定屬性或事件的描述。 |
N/A |
|
指定不使用引數之屬性、事件或 public void 方法的顯示名稱。 |
為這個屬性 (Attribute) 所套用至的屬性 (Property),指定將顯示在 [屬性] 視窗中的名稱。 |
|
指定用來變更屬性的編輯器。 |
指定用來變更屬性的編輯器,包括多屬性分類編輯器。 |
|
N/A |
EditorBrowsableState.Advanced 會將分類編輯器或屬性放置於進階 Expander 中。 |
|
指定類別或成員的內容關鍵字。 |
N/A |
|
指定屬性是否應該當地語系化。 |
N/A |
|
指出物件的文字表示已由星號之類的字元所遮蔽。 |
N/A |
|
指定這個屬性 (Attribute) 所繫結至的屬性 (Property) 在設計階段是否為唯讀,或可供讀取/寫入。 |
指定這個屬性 (Attribute) 所繫結至的屬性 (Property) 在設計階段是否為唯讀,或可供讀取/寫入。 標示為 ReadOnlyAttribute 的屬性,會在屬性偵測器中,將唯讀物件顯示至字串編輯器中。 |
|
表示 [屬性] 視窗應該在相關的屬性值變更時重新整理。 |
N/A |
|
指定要用來做為此屬性 (Attribute) 所繫結至物件的型別轉換子。 |
指定要用來做為此屬性 (Attribute) 所繫結至物件的型別轉換子。 |
|
指定元件的預設事件。 |
指定元件的預設事件,這麼做會決定按兩下時要建立事件處理常式。 |
|
指定元件的預設屬性。 |
指定元件的預設屬性,這麼做會決定預設選取哪一個屬性。 |
|
指定用來實作元件的設計階段服務的類別。 |
N/A |
|
指定屬於特定分類之類別的設計工具。 |
N/A |
|
代表工具箱項目的屬性 (Attribute)。 |
N/A |
|
指定工具箱所使用的篩選字串和篩選類型。 |
N/A |
|
N/A |
當檢查組件的類型以加入至工具箱時,用於避免類型出現在工具箱中。 |
|
N/A |
用於指定哪些項目要加入至集合編輯器或子屬性編輯器的下拉式方塊。 允許指定自訂建立的 Factory。 |
|
N/A |
用於指定屬性在 [屬性] 視窗中出現的順序。 |
下列屬性使用於 WPF Designer架構中,但不使用於 Windows Form 設計工具架構中。
指定工具箱圖示的差異
在 Windows Form 設計工具架構中,您要將 ToolboxBitmapAttribute 套用至您的控制項類別中,藉此指定自訂控制項的工具箱圖示。
在 WPF Designer架構中,您會使用內嵌資源和命名規範來指定工具箱點陣圖。 此外,您還會使用 ToolboxBrowsableAttribute,限制組件中的哪些類型可填入工具箱。
指定中繼資料的差異
在 Windows Form 中,設計工具中繼資料是透過套用像 DesignerAttribute 之類的屬性 (Attribute),以宣告方式加以指定的。
在 WPF Designer架構中,設計工具中繼資料是在 AttributeTable 中指定的。