編輯模型架構

設計階段實作會透過一個稱為「編輯模型」(Editing Model) 的程式設計介面,與執行階段的控制項互動。 所設計的物件稱為「可編輯物件」(Editable Object)。 本主題將說明 WPF Designer for Visual Studio 編輯模型的架構和使用方式。

您的控制項是以可延伸應用程式標記語言 (XAML) 定義的。 您會使用編輯模型,以程式設計方式更新控制項的 XAML。

模型、包裝函式和檢視

這個編輯模型包含三個功能子單元:模型、擷取該模型的公用包裝函式,以及代表該模型之使用者介面 (UI) 的檢視。 模型和檢視是各自獨立的,但包裝函式和模型則緊密相關。 下圖顯示這三個子單元之間的關係。

Model、ModelItem 和 View 的關係

設計環境使用 ModelItem 型別與基礎模型通訊。 所有的變更都是針對 ModelItem 包裝函式進行,然後再由包裝函式影響基礎模型, 如此便可讓模型保持簡單。 ModelItem 包裝函式會處理複雜的設計工具功能,例如交易支援、復原追蹤和變更通知等。

執行個體建立

任何需要在設計介面上建立新物件的設計工具功能都會使用 ModelFactory 類別。 設計工具中的每個物件都會使用 ModelItem 執行個體包裝。 模型項目是由 ModelFactory 所建立。

下列程式碼顯示一般的 ModelFactory 呼叫。

ModelItem newButton = ModelFactory.CreateItem(_context, typeof(Button));

CreateItem 方法一律會傳回資料型別 ModelItem。 這是 WPF Designer編輯模型中所有項目的基底型別 (Base Type),它表示傳遞給 CreateItem 方法之型別的包裝執行個體。 CreateItem 方法也需要 WPF Designer編輯內容 (上一個程式碼範例中的 _context) 的執行個體,用來找出設計工具中的其他服務和相依性。

透過 Factory 明確建立項目,只有在置於設計介面上的物件可能有預設初始設定式時才重要。 如果只是要設定屬性值,就不需要這個程序。

請務必使用 CreateItem 方法,在設計介面上建立新物件。 這是因為許多原始的執行個體無法剖析成模型項目。 一旦值設定在模型中,您便應該只透過模型與它互動。 支持模型的執行個體隨時都可以由架構重建,而此情況會使您已快取的任何參考失效。

建立選項

您有時會需要自訂物件的建立行為。 例如,資料庫連接元件可能會選擇不在設計階段查詢資料庫。 您可能會想在元件第一次建立時,能夠控制執行個體的建立。

在此情況下,元件是從 [工具箱] 拖曳或從剪貼簿貼上的。 您可能會想使用可用的預設值來預先設定元件。 這些預設值如果沒有變更,就會序列化為 XAML。

您可以使用 CreateOptions 列舉,將一組選用的旗標傳遞至 CreateItem 方法。

InitializeDefaults 旗標會由像是建立工具的工具使用,以便初始化一組預先設定的屬性值。 例如,ContentControl 可能會提供一些預設內容。 這並不會取代在執行階段控制項程式碼中正確設定屬性的預設值。

使用此旗標設定的值會保存到 XAML。

此旗標不應由剖析程式碼使用,因為使用者在設計工具中編輯物件時可能已移除預設值。

CreateItem 方法會將呼叫傳遞至 CreateItem。 此方法會執行數個步驟,如下列流程圖所示。

使用建立 API 建立的明確執行個體

將項目的父代變更為新容器

除了建立新項目,設計人員的另一個常見工作就是將某個項目的父代變更成另一個父代。 這是透過名為 ModelParent 的靜態類別處理,此類別可提供功能來解決大多數父代設定的需求。

  • 根據要在搜尋的階層架構中的座標位移或開始項目,找出有效的父物件。

  • 判斷特定物件是否能夠成為特定型別的父代。

  • 將某個物件的父代變成另一個父代。 這項變更也會將舊父代從物件移除。 此移除動作可讓舊父代有機會清除任何資料,例如可能位於項目上的附加屬性。

ModelParent 類別的運作方式是尋找 ParentAdapter 類別,以找出目前和提議的父物件。 如果沒有 ParentAdapter 類別存在,則無法將物件指派給父代。 ParentAdapter 類別針對常見案例定義有幾個覆寫。 例如,許多覆寫都接受 GestureData 物件做為參數。 當程式碼處理使用者命令時,可從 WPF Designer命令機制使用此資料型別。 它提供了通用的內容資訊。

ParentAdapter 可讓容器聰明地移除父代。 例如,如果物件的 Canvas 控制項父代變更為 Grid 控制項父代,那麼 Canvas 控制項在物件上的附加屬性就可自動移除。

請參閱

參考

EditingContext

Microsoft.Windows.Design.Services

GestureData

其他資源

WPF 設計工具擴充性