為設計工具提供復原支援
設計工具 (例如編輯器) 通常需要支援復原作業,讓使用者可以在修改程式碼元素時反轉其最近的變更。
在 Visual Studio 中實作的大部分設計工具,都會有環境自動提供的「復原」支援。
需要為復原功能提供支援的設計工具實作:
實作抽象基底類別 UndoEngine 來提供復原管理
藉由實作 IDesignerSerializationService 和 IComponentChangeService 類別來提供持續性和 CodeDOM 支援。
如需使用 .NET Framework 撰寫設計工具的詳細資訊,請參閱擴充設計時間支援。
Visual Studio SDK 透過以下方式提供預設的復原基礎結構:
透過 OleUndoEngine 和 OleUndoEngine.UndoUnit 類別提供復原管理實作。
透過預設 CodeDomComponentSerializationService 和 IComponentChangeService 實作來提供持續性和 CodeDOM 支援。
自動取得復原支援
在 Visual Studio 中建立的任何設計工具都會有自動且完整的復原支援,只要設計工具:
針對其使用者介面使用以 Control 為基礎的類別。
針對程式碼產生和持續性採用標準 CodeDOM 型程式碼產生和剖析系統。
如需使用 Visual Studio CodeDOM 支援的詳細資訊,請參閱動態原始程式碼產生和編譯。
使用明確設計工具復原支援的時機
如果設計工具使用圖形使用者介面 (稱為檢視配接器),而不是提供的 Control 圖形使用者介面,則必須提供自己的復原管理。
其中一個範例可能是使用 Web 型圖形設計介面來建立產品,而不是以 .NET Framework 為基礎的圖形化介面。
在這種情況下,您必須使用 ProvideViewAdapterAttribute 向 Visual Studio 註冊此檢視配接器,並提供明確的復原管理。
如果設計工具不使用 System.CodeDom 命名空間提供的 Visual Studio 程式碼產生模型,則必須提供 CodeDOM 和持續性支援。
設計工具的復原支援功能
環境 SDK 提供復原支援所需的介面預設實作,可供不使用基於 Control 的類別做為其使用者介面或標準 CodeDOM 和持續性模型的設計人員使用。
OleUndoEngine 類別衍生自 .NET Framework UndoEngine 類別,使用 IOleUndoManager 類別的實作來管理復原作業。
Visual Studio 提供下列功能讓設計工具復原:
跨多個設計工具連結的復原功能。
設計工具內的子單元可以藉由實作 IOleUndoUnit 和 IOleParentUndoUnit 在 OleUndoEngine.UndoUnit上與其父系互動。
環境 SDK 提供 CodeDOM 和持續性支援,其方法是提供:
CodeDomComponentSerializationService做為 IDesignerSerializationService 的實作。
Visual Studio 設計主機所提供的 IComponentChangeService。
使用環境 SDK 功能提供來復原支援
若要取得復原支援,實作設計工具的物件必須使用有效的 IServiceProvider 實作來具現化和初始化 OleUndoEngine 類別的執行個體。 此 IServiceProvider 類別必須提供下列服務:
-
使用 Visual Studio CodeDOM 序列化的設計工具可以選擇使用 CodeDomComponentSerializationService 隨附於 Visual Studio SDK 做為其IDesignerSerializationService 實作。
在此案例中,提供 給 OleUndoEngine 建構函式的 IServiceProvider 類別,應該傳回這個物件做為 IDesignerSerializationService 類別的實作。
-
使用 Visual Studio 設計主機提供之預設值 DesignSurface 的設計工具,保證具有 IComponentChangeService 類別的預設實作。
實作 OleUndoEngine 型復原機制的設計工具會在以下條件下自動追蹤變更:
屬性變更透過 TypeDescriptor 物件進行。
當認可可復原的變更時,就會手動產生 IComponentChangeService 事件。
在設計工具上的修改是在 DesignerTransaction 的內容中建立的。
設計工具選擇使用實作 UndoEngine.UndoUnit 所提供的標準復原單元,或以 Visual Studio 特定的 OleUndoEngine.UndoUnit 實作所提供的來明確建立復原單元,而這是衍生自 UndoEngine.UndoUnit,也提供 IOleUndoUnit 和 IOleParentUndoUnit 的實作。