向设计器提供撤消支持
设计器(如编辑器)通常需要支持撤消操作,以便用户可以在修改代码元素时反转其最近的更改。
在 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 的图形界面)的产品。
在这种情况下,需要使用 Visual Studio ProvideViewAdapterAttribute注册此视图适配器并提供显式撤消管理。
如果设计器不使用名称空间中 System.CodeDom 提供的 Visual Studio 代码生成模型,则需要提供 CodeDOM 和持久性支持。
撤消设计器的支持功能
环境 SDK 提供提供撤消支持所需的接口的默认实现,这些支持可供设计者不对其用户界面或标准 CodeDOM 和持久性模型使用基于类的设计器使用 Control 。
该 OleUndoEngine 类派生自 .NET Framework UndoEngine 类,该类使用类的 IOleUndoManager 实现来管理撤消操作。
Visual Studio 为设计器撤消提供以下功能:
跨多个设计器链接撤消功能。
设计器中的子单元可以通过实现 IOleUndoUnit 和 IOleParentUndoUnit 打开 OleUndoEngine.UndoUnit来与其父单元进行交互。
环境 SDK 通过提供以下方法提供 CodeDOM 和持久性支持:
CodeDomComponentSerializationService 作为实现 IDesignerSerializationService
IComponentChangeService Visual Studio 设计主机提供的。
使用环境 SDK 功能提供撤消支持
若要获取撤消支持,实现设计器的对象必须使用有效的IServiceProvider实现实例化和初始化类的OleUndoEngine实例。 此类 IServiceProvider 必须提供以下服务:
-
使用 Visual Studio CodeDOM 序列化的设计器可以选择使用 CodeDomComponentSerializationService Visual Studio SDK 提供的作为其实现的 IDesignerSerializationService设计器。
在这种情况下,提供给构造函数的IServiceProviderOleUndoEngine类应将此对象作为类的IDesignerSerializationService实现返回。
-
使用 Visual Studio 设计主机提供的默认 DesignSurface 设计器可以保证具有类的默认实现 IComponentChangeService 。
实现 OleUndoEngine 基于撤消机制的设计器会在以下情况下自动跟踪更改:
通过对象进行 TypeDescriptor 属性更改。
IComponentChangeService 提交不可撤消的更改时,手动生成事件。
在设计器的上下文中创建对设计器的 DesignerTransaction修改。
设计器选择使用实现提供的标准撤消单元或 Visual Studio 特定的实现显式创建撤消单元,该实现UndoEngine.UndoUnitOleUndoEngine.UndoUnit派生自UndoEngine.UndoUnit并同时提供这两IOleUndoUnitIOleParentUndoUnit者的实现。