Visual Studio 2010 中的扩展性更改
适用于 Visual Studio 的 WPF 设计器为实现 WPF 和 Silverlight 控件的自定义设计体验提供了一个成熟的平台。 自 Visual Studio 2008 中的初次发布以来,WPF 设计器扩展性 API 已得到了显著的发展。 以下各节描述了用于 Visual Studio 2010 的 WPF 设计器扩展性发生的变化。
对 Silverlight 和多个平台版本的支持
在 Visual Studio 2008 中,控件设计时只能以最新的 WPF 平台版本为目标。 在 Visual Studio 2010 中,这种支持扩展到多个平台,包括对 WPF 3.5、WPF 4.0、Silverlight 3 和未来平台发行版的设计时支持。 因为所有这些平台都有同一可扩展性 API,控件设计时作者可以轻松地编写一种体验,并将其在各种平台的控件运行时之间共享。
Expression Blend 中的支持情况
通过使用 Visual Studio 中提供的同一可扩展性接口,您现在能够以 Expression Blend 为目标实现您的控件设计时。 您可以决定是为这两种创作环境分别提供设计时体验,还是提供通用的设计时体验。
注册元数据
在该可扩展性 API 中,最显著的差异是:IRegisterMetadata 接口已替换为 IProvideAttributeTable 接口。 这种更改与多平台支持功能的结合,使可扩展性 API 发生了突破性的变化。 这意味着,Visual Studio 2010 中将不会加载 Visual Studio 2008 现有的控件设计时实现。
此外,在 Visual Studio 2010 中,您使用 ProvideMetadataAttribute 特性来指示设计时程序集向设计器提供元数据。
新的扩展点
新的扩展性 API 还支持新的设计时体验,包括:
在“属性”窗口中,支持从类别编辑器访问模型。 这种变化与将通用属性提升到类别列表的顶部一起,使控件作者能够在“属性”窗口中提供丰富的编辑体验。
新的 AdornerPanel 实用工具方法,能够更加轻松地相对于自定义控件放置装饰器。
用于在不同的设计工具(例如 Visual Studio 和 Expression Blend)之间共享设计时实现的新编程模型。
用于在多个目标框架之间共享设计时实现的新编程模型。
比较 Visual Studio 2008 和 Visual Studio 2010 中的扩展性
下表总结了 Visual Studio 2008 和 Visual Studio 2010 中的创作自定义设计时体验之间的差异。
Visual Studio 2008 |
Visual Studio 2010 |
---|---|
若要注册设计时类型,请实现 IRegisterMetadata 接口并使用 MetadataStore 类。 |
若要注册设计时类型,请实现 IProvideAttributeTable 接口并调用 CreateTable 方法。 |
无需添加程序集级别特性。 |
必须用 ProvideMetadataAttribute 特性标记设计时程序集。 |
若要将设计器类型与图形元素关联,请对 NewItemFactory 使用 GetImage 方法,该方法可能会返回各种元素类型。 |
若要将设计器类型与图标关联,请使用 GetImageStream 方法返回位图。 只支持位图。 |
若要访问模型属性,请使用依赖项属性,例如: ModelProperty backgroundProperty = adornedControlModel.Properties[Control.BackgroundProperty]; |
若要访问模型属性,请使用依赖项属性的名称,例如: ModelProperty backgroundProperty = adornedControlModel.Properties["Background"]; 此外,您可以定义 PropertyIdentifier(一个类型/字符串组合)。 当简单名称查找不足时,会将 PropertyIdentifier 与附加的属性一起使用。 |
若要区分布局空间和呈现空间,请使用 AdornerCoordinateSpaces 类。 |
不使用 AdornerCoordinateSpaces 类。 |
若要指定相对于内容的装饰器位置,请使用 AdornerPlacementCollection 类。 |
若要指定相对于内容的装饰器位置,请使用 SetAdornerHorizontalAlignment、SetAdornerVerticalAlignment 和 SetAdornerMargin 方法。 保留 AdornerPlacementCollection 类的目的是为了向后兼容。 |