设计器(如编辑器)通常需要支持撤消操作,以便用户可以在修改代码元素时撤销其最近的更改。
在 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 和持久性模型的设计者。
该OleUndoEngine类派生自.NET Framework UndoEngine类,使用IOleUndoManager类的实现来管理撤消操作。
Visual Studio 为设计器撤消提供以下功能:
跨多个设计器的链接撤销功能。
设计器中的子单元可以通过在 OleUndoEngine.UndoUnit 上实现 IOleUndoUnit 和 IOleParentUndoUnit 来与其父单元进行交互。
环境 SDK 通过提供以下方法提供 CodeDOM 和持久性支持:
作为 的实现 由 Visual Studio 设计主机提供的 IComponentChangeService。
使用环境SDK的功能来提供撤消支持
若要获取撤消支持,实现设计器的对象必须使用有效的OleUndoEngine实现实例化和初始化类的IServiceProvider实例。 此类 IServiceProvider 必须提供以下服务:
-
使用 Visual Studio CodeDOM 序列化的设计器可以选择使用 Visual Studio SDK 提供的 CodeDomComponentSerializationService 作为其 IDesignerSerializationService 的实现。
在这种情况下,提供给IServiceProviderOleUndoEngine构造函数的类应返回此对象作为IDesignerSerializationService类的实现。
-
使用 Visual Studio 设计主机提供的默认 DesignSurface 的设计人员可以确保具有 IComponentChangeService 类的默认实现。
设计师在实现基于 OleUndoEngine 的撤消机制时,如果满足以下条件,会自动跟踪更改:
属性更改通过TypeDescriptor对象进行。
IComponentChangeService 提交不可撤消的更改时,手动生成事件。
在设计器的上下文中创建了对设计器的DesignerTransaction修改。
设计人员选择显式创建撤消单元,可以使用由UndoEngine.UndoUnit实现提供的标准撤消单元,或者使用 Visual Studio 特定的实现OleUndoEngine.UndoUnit。这个实现源自UndoEngine.UndoUnit,同时提供IOleUndoUnit和IOleParentUndoUnit的实现。