WPF 设计器扩展性体系结构

适用于 Visual Studio 的 WPF 设计器是 WPF 和 Silverlight 元素的直观的编辑环境。 WPF 设计器基于一个具有可扩展的体系结构的框架,您可以扩展这种框架以创建自己的自定义设计体验。

通过扩展 WPF 设计器框架,可以在很大程度上自定义 WPF 和 Silverlight 内容的设计时外观和行为。 例如,可以通过下列方式扩展 WPF 设计器:

  • 利用增强的图形自定义移动并调整标志符号的大小。

  • 向设计图面中添加一个用于更改控件状态的快捷菜单。

  • 在不同工具之间修改控件的设计时外观和行为。

WPF 设计器 体系结构支持 WPF 和 Silverlight 的所有表现力。 这样便可以创建很多以前不可能拥有的可视化设计体验。

有关如何为 WPF 和 Visual Studio 实现自定义设计时体验的示例,请参见演练:创建设计时装饰器。 

有关演示如何创建 WPF and Silverlight 的自定义设计体验的示例代码,请参见 WPF Designer Extensibility Samples(WPF 设计器扩展性示例)网站。

WPF 设计器框架

WPF 设计器框架是模块化的,这意味着在扩展设计时的时候,只需扩展各项功能所需的元素即可。 您不必编写大量支持代码来启用自定义设计功能。

该对象模型包括五个功能单元,将在下表中对它们进行描述。

功能单元

说明

编辑模型

设计器中对象的编程接口。

功能提供程序

设计器框架中的主扩展性点。

编辑上下文

设计器状态的中央存储区。

命令、任务和工具

用于处理用户输入的命令、任务和工具。

设计时元数据

程序集,包含控件的设计时行为以便通过物理方式将设计器逻辑与运行时逻辑分开。

下图演示 WPF 设计器 框架的功能单元。

高级对象模型

编辑模型

设计环境通过一个称为编辑模型的编程接口与运行时控件交互。 编辑模型包括三个功能子单元:一个模型、一个使模型抽象化的公共包装和一个表示模型的用户界面 (UI) 的视图。

设计环境使用 ModelItem 类型与基础模型进行通信。 所有更改都针对 ModelItem 包装进行,这些包装影响基础模型。 这样可使模型简单一些。 ModelItem 包装处理复杂的设计器功能,例如事务支持、撤消跟踪以及更改通知。

ModelService 类为编辑模型和全局事件通知提供入口点。

ViewService 类将可视化表示形式映射到基础模型项。

设计器需要这两种服务才能发挥作用。 DesignerView 类负责处理用户输入并将用户输入传送给命令,该类需要这两种服务才能准确地将用户输入映射回模型。

功能提供程序

可以通过使用 FeatureProviderFeatureConnector<TFeatureProviderType> 类来扩展类型的设计时行为。 FeatureConnector<TFeatureProviderType> 类管理一系列 FeatureProvider 对象。

FeatureProvider 类提供最基本的扩展性点。 功能提供程序是一种轻量功能或外接程序,通常它不对设计环境提出更多要求并且在给定上下文中创建和销毁。 功能提供程序用于向设计图面中添加新的 UI 位或者用于修改某些基本行为。 例如,某个功能提供程序可能会添加更多抓取手柄或者提供一种新的鼠标拖动行为。

若要访问扩展性的最深层,请从 FeatureConnector<TFeatureProviderType> 类派生。 此类公开一个服务提供程序,派生的功能连接器类可通过该提供程序处理事件并且请求和发布服务。 例如,您可能会实现一个功能连接器来提供用于选择的 UI 或对象特定的序列化。

通常,实现功能来扩展现有概念。 实现功能连接器来提供新概念。 有关更多信息,请参见功能提供程序和功能连接器

编辑上下文

大量状态信息在运行的设计器中累积。 例如,设计器状态可能包含以下内容:选择了哪些对象或者在按下鼠标左键时发生的行为。 设计器状态存储在一个中央位置,以便在需要时可以找到它。 EditingContext 类表示设计器状态的这一中央储存库。

EditingContext 类将状态分为两个类别:数据和行为。 数据作为包含上下文项的表存储,行为作为包含服务的表存储。 这两个表都根据基于类型的键进行索引并且都可以枚举。

ContextItem 类保留设计器中的单个状态。 上下文项是不可变的,但新上下文项可以替换现有上下文项来模拟可变性。

服务通过 Services 属性进行访问,该属性返回 ServiceManager 的实例;上下文项通过 Items 属性进行访问,该属性返回 ContextItemManager 的实例。

命令、任务和工具

WPF 设计器工具体系结构包括命令、任务和工具。 

命令是一个表示某一行为的唯一标识符。 例如,“剪切”便是一个命令,它表示剪切当前文本并将其添加到剪贴板中。 实现“剪切”命令的代码在应用程序之间甚至在一个应用程序内部会有所不同。 例如,剪切文本在 Word 文档中的实现与在该相同文档的搜索文本框中的实现是不同的。 无论实现如何,“剪切”命令总是相同的。

WPF 设计器通过引入工具命令的概念扩充了 WPF 命令系统。 工具命令可实现 ICommand 接口,并与 RoutedCommand 类相似。

“任务”具有命令绑定的集合,允许您添加路由命令。 DesignerView 类具有的代码可以使用与工具命令相同的路由策略来查找和执行在任务上定义的路由命令。 DesignerView 类启用支持 Copy 等常用 WPF 命令的任务。

“工具”是一个处理用户输入的类。 所有用户输入都作为一个或多个输入事件进入设计器。 这些输入事件传递到当前活动的工具,后者将它们转换为输入绑定。 如果返回的是输入绑定,则执行该绑定内的命令。

工具可以表示设计器的全局模式。 例如,如果用户正在选择设计图面上的组件,则可以使用该选择模式,因为当前活动的工具提供可处理选择操作的输入绑定和命令。 当用户创建控件的一个新实例时,另一个工具变成活动工具并提供一组不同的命令,这些命令绑定到相同的输入绑定。

设计时元数据

在 WPF 设计器框架中,定义控件的设计时行为的元数据由特性指定,包含在一个单独的程序集内。 不同的设计器可以使用具有完全不同的设计时实现的不同元数据程序集。 这会使运行时和设计时行为分开,以便您可以独立于控件修订设计器。

若要指定提供设计时实现的程序集,请使用 ProvideMetadataAttribute 标记程序集并包括一个实现 IProvideAttributeTable 接口的类。

有关更多信息,请参见 提供设计时元数据

Expression Blend 中的设计时支持

WPF 设计器支持扩展性框架中的所有功能。 Expression Blend 支持下列功能。

Expression Blend 不支持 ParentAdapterPlacementAdapter

WPF 设计器程序集

WPF 设计器包括若干个程序集,这些程序集分为三个类别:公共类别、私有类别和特定于设计器的类别。

公共程序集公开可用于向控件添加设计时逻辑的类。

私有程序集和特定于设计器的程序集定义 WPF 设计器的功能集以及该功能集与设计器(如 Visual Studio 和 Expression Blend)的交互。

WPF 和 Silverlight 设计器作为单个实体安装。 每个设计器没有单独的包。

下表显示了如何部署 WPF 设计器功能。

程序集

公共 API

说明

Microsoft.Windows.Design.Extensibility.dll

通过特性和 Visual Studio SDK 集成逻辑提供扩展性模型。

Microsoft.Windows.Design.Interaction.dll

提供用户输入和显示类。

Microsoft.Windows.Design.Markup.dll

提供 XAML 和文档模型机制。

Microsoft.VisualStudio.Xaml.dll

通过服务、数据底板以及对元数据的操作为任何设计器提供基本的 XAML 基础。

Microsoft.Windows.Design.Host.dll

用于承载设计器的私有 API(特定于 Visual Studio)。

Microsoft.Windows.Design.Developer.dll

WPF 设计器实现。

Microsoft.Windows.Design.Developer.WPF.dll

Microsoft.Windows.Design.Developer.Silverlight.dll

Microsoft.Windows.Design.Platform.dll

具有抽象类的平台层。 平台实现在此程序集中实现抽象类。

Microsoft.Windows.Design.Platform.WPF.dll

用于 WPF 的特定于平台的设计时。

Microsoft.Windows.Design.Platform.Silverlight.dll

用于 Silverlight 的特定于平台的设计时。

Microsoft.Expression.DesignModel.dll

Expression Blend 设计时程序集。

Microsoft.Expression.Platform.WPF.dll

Expression Blend 设计时程序集。

Microsoft.Expression.Platform.Silverlight.dll

Expression Blend 设计时程序集。

提示

程序集表示功能边界而不是命名空间边界。 通常可以发现跨越多个程序集的命名空间。

WPF 设计器和 Windows 窗体设计器体系结构

WPF 设计器体系结构与 Windows 窗体设计器体系结构差别很大,后者以 IComponent 接口和 System.ComponentModel 命名空间为特征。 有关更多信息,请参见比较 Windows 窗体设计器框架与 WPF 设计器框架

请参见

概念

功能提供程序和功能连接器

其他资源

提供设计时元数据

设计时开发 Windows 窗体控件

WPF 设计器扩展性