设计器基类
所有设计器都实现 IDesigner 接口,该接口定义了基本的设计器接口方法。 .NET Framework 还提供了一组基设计器类,这些类提供了对于支持特定类型组件或控件的设计器有用的方法。
IDesigner 接口
设计器类必须实现 IDesigner 接口,如下面的代码示例所示。
Public Interface IDesigner
Sub Dispose()
Sub Initialize(component As IComponent)
' Other methods.
...
ReadOnly Property Component() As IComponent
' Other properties.
...
End Interface
public interface IDesigner {
void Dispose();
void Initialize(IComponent component);
// Other methods.
...
IComponent Component {
get;
}
// Other properties.
...
}
在已经放置并初始化了设计器的组件并创建了设计器之后,就会调用 IDesigner 的 Initialize 方法。 您可以重写 Initialize 方法来执行在组件或设计器初始化时发生的操作。 您不能替换组件的构造函数初始化,但可以增加它或重置它初始化的属性。 IDesigner 的 Component 属性是通过这种初始化方法设置的。 如果重写此方法,应该始终从 Initialize 方法调用 base.Initialize(component)。 您可以从 IDesigner 的 Component 属性访问它的组件。
Component 属性提供对此设计器的关联组件的访问。 当首次创建设计器对象并调用 Initialize 方法时设置该属性。 组件有一个与之关联的站点,设计器可使用该站点从设计器宿主中获取服务。
双击组件或控件时,将调用 DoDefaultAction 方法。
可以重写 Verbs 属性,以返回 DesignerVerbCollection,该集合包含了扩展组件快捷菜单的菜单项所需的对象。
需要损坏设计器对象时,调用 Dispose 方法。 每当从设计容器中移除组件时都调用该方法。
组件的基设计器类
ComponentDesigner 类实现 IDesigner 和 IDesignerFilter 接口来提供更多方法,供组件的某些设计器使用。
Windows 窗体控件的基设计器类
Windows 窗体控件的基设计器类是 ControlDesigner。 这个类是从 ComponentDesigner 派生的,它为自定义 Windows 窗体控件的外观和行为提供了其他一些有用的方法。 有关 Windows 窗体设计器的示例实现,请参见如何:实现控件的设计器。
DocumentDesigner 类提供了一个基设计器,可用来扩展支持嵌套控件并接收滚动消息的 Control 的设计模式行为,并可用来为该控件提供根级设计模式视图。 有关更多信息,请参见如何:创建利用设计时功能的 Windows 窗体控件。
备注
必须添加对设计时程序集 System.Design.dll 的引用。此程序集不包含在 .NET Framework 4 Client Profile 中。若要添加对 System.Design.dll 的引用,必须将项目的目标框架更改为“.NET Framework 4”。
ASP.NET 服务器控件的基设计器类
ASP.NET 服务器控件的基设计器类是 ControlDesigner。 该类为自定义设计时 HTML 呈现提供基本功能。
设计时集成的基类
TypeConverter 类为在类型与文本表示形式之间来回转换提供了一个基类。 有关类型转换器的更多信息,请参见如何:实现类型转换器或通用类型转换。
UITypeEditor 类提供了一个基类,您可以从其派生或将其扩展,来为设计时环境实现一个自定义类型编辑器。 有关实现 UITypeEditor 的更多信息,请参见用户界面类型编辑器概述。
设计器外观和行为的基类
通过扩展 Behavior 类,可开发任意类型的用户界面行为,包括选择、拖动和调整行为。 绘制和点击测试由 Glyph 类来执行。
有关更多信息,请参见 行为服务概述。
备注
必须添加对设计时程序集 System.Design.dll 的引用。此程序集不包含在 .NET Framework 4 Client Profile 中。若要添加对 System.Design.dll 的引用,必须将项目的目标框架更改为“.NET Framework 4”。
设计器加载程序的基类
BasicDesignerLoader 类提供 IDesignerLoaderService 接口的实现。 BasicDesignerLoader 是设计器加载程序的完整实现,与持久性格式无任何关联。
CodeDomDesignerLoader 是一个抽象类,它提供基于代码文档对象模型 (CodeDOM) 的完整设计器加载程序。
设计器序列化的基类
CodeDomSerializerBase 类为 CodeDomSerializer 类提供了一个基类。 CodeDomSerializerBase 类用作 CodeDomSerializer 和 TypeCodeDomSerializer 类之间的共享基。
DesignerSerializationManager 类提供 IDesignerSerializationManager 接口的实现。
有关更多信息,请参见设计器序列化概述。
智能标记的基类
DesignerActionList 类为那些定义用于创建智能标记面板的项列表的类型提供基类。 有关更多信息,请参见如何:向 Windows 窗体组件附加智能标记。
备注
必须添加对设计时程序集 System.Design.dll 的引用。此程序集不包含在 .NET Framework 4 Client Profile 中。若要添加对 System.Design.dll 的引用,必须将项目的目标框架更改为“.NET Framework 4”。
自定义布局的基类
LayoutEngine 类为实现布局引擎提供基类。 TableLayoutPanel 和 FlowLayoutPanel 控件使用 LayoutEngine 类来提供布局行为。 有关更多信息,请参见如何:实现自定义布局引擎。
标准设计器
Windows 软件开发包 (SDK) 提供了一组设计器以支持特定的组件类型。 这些设计器根据它们设计的组件命名,并以 Designer 一词作为后缀。 例如,Control 类的设计器是 ControlDesigner。
通用设计器功能
从设计器访问设计时服务
通过传递要请求的服务类型,使用 GetService 方法可以请求大多数类型的设计时服务。 Component 和 ComponentDesigner 上有一个 GetService 方法。 IServiceProvider 上也有一个 GetService 方法,该方法由设计模式中的 IComponent 的 Site 属性返回的 ISite 实现。
下面的代码演示如何使用 GetService 方法获取 IDesignerHost 服务接口和 IMenuCommandService。
有关更多信息,请参见如何:访问设计时服务。
以下代码说明如何从设计模式服务提供程序接口获取服务。
' Obtain an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Obtain an IMenuCommandService service.
Dim mcs As IMenuCommandService = CType(Me.Component.Site.GetService(GetType(IMenuCommandService)), IMenuCommandService)
// Obtain an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Obtain an IMenuCommandService service.
IMenuCommandService mcs =
(IMenuCommandService)this.Component.Site.GetService(typeof(IMenuCommandService));
从设计器访问项目组件
通过访问 IDesignerHost 服务接口的 Container 属性的 Components 集合,设计器可以访问设计模式文档中的组件。 下面的代码示例说明如何在当前设计模式项目中访问组件。
' Obtains an IDesignerHost service from the design-time environment.
Dim host As IDesignerHost = CType(Me.Component.Site.GetService(GetType(IDesignerHost)), IDesignerHost)
' Gets the components container for the current design-time project.
Dim container As IContainer = host.Container
' The host.Container IContainer contains each IComponent in the project.
// Obtains an IDesignerHost service from the design-time environment.
IDesignerHost host = (IDesignerHost)this.Component.Site.GetService(typeof(IDesignerHost));
// Gets the components container for the current design-time project.
IContainer container = host.Container;
// The host.Container IContainer contains each IComponent in the project.
一旦能够访问组件集合,就可以使用 TypeDescriptor 方法和 PropertyDescriptor 对象来标识类型和设置组件属性的值。 您还可以使用 IDesignerHost 接口的 CreateComponent 方法来创建组件。
扩展设计器
当从具有关联设计器的组件派生时,默认情况下基类的设计器与派生的组件关联。 您可以将组件与其他设计器关联,方法是:使用 DesignerAttribute 特性指定要与组件关联的设计器的类型。 派生组件普遍具有扩展基设计器的设计器。
有关更多信息,请参见如何:实现控件的设计器。
扩展设计器
定义从基设计器类派生的类。
通过应用 DesignerAttribute 将新设计器类与组件关联。
下面的代码示例定义了一个设计器,它可扩展 LabelDesigner 并将其与扩展 Label 的自定义标签相关联。
Namespace MyControls.Design
Public Class MyLabelDesigner
Inherits System.Web.UI.Design.WebControls.LabelDesigner
End Class
End Namespace
Namespace MyControls
<Designer(GetType(MyControls.Design.MyLabelDesigner))> _
Public Class MyLabel
Inherits System.Web.UI.WebControls.Label
End Class
End Namespace
namespace MyControls.Design {
public class MyLabelDesigner : System.Web.UI.Design.WebControls.LabelDesigner {}
}
namespace MyControls {
[Designer(typeof(MyControls.Design.MyLabelDesigner))]
public class MyLabel : System.Web.UI.WebControls.Label {}
}
备注
如果为密封类定义设计器,或者不希望其他类使用或继承设计器,可以使设计器类成为程序集的内部类。设计器宿主仍然能够创建设计器的实例,但它不会构成公共对象模型。