设计器基类

所有设计器都实现 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.
   ...
}

在已经放置并初始化了设计器的组件并创建了设计器之后,就会调用 IDesignerInitialize 方法。 您可以重写 Initialize 方法来执行在组件或设计器初始化时发生的操作。 您不能替换组件的构造函数初始化,但可以增加它或重置它初始化的属性。 IDesignerComponent 属性是通过这种初始化方法设置的。 如果重写此方法,应该始终从 Initialize 方法调用 base.Initialize(component)。 您可以从 IDesignerComponent 属性访问它的组件。

Component 属性提供对此设计器的关联组件的访问。 当首次创建设计器对象并调用 Initialize 方法时设置该属性。 组件有一个与之关联的站点,设计器可使用该站点从设计器宿主中获取服务。

双击组件或控件时,将调用 DoDefaultAction 方法。

可以重写 Verbs 属性,以返回 DesignerVerbCollection,该集合包含了扩展组件快捷菜单的菜单项所需的对象。

需要损坏设计器对象时,调用 Dispose 方法。 每当从设计容器中移除组件时都调用该方法。

组件的基设计器类

ComponentDesigner 类实现 IDesignerIDesignerFilter 接口来提供更多方法,供组件的某些设计器使用。

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 类用作 CodeDomSerializerTypeCodeDomSerializer 类之间的共享基。

DesignerSerializationManager 类提供 IDesignerSerializationManager 接口的实现。

有关更多信息,请参见设计器序列化概述

智能标记的基类

DesignerActionList 类为那些定义用于创建智能标记面板的项列表的类型提供基类。 有关更多信息,请参见如何:向 Windows 窗体组件附加智能标记

备注

必须添加对设计时程序集 System.Design.dll 的引用。此程序集不包含在 .NET Framework 4 Client Profile 中。若要添加对 System.Design.dll 的引用,必须将项目的目标框架更改为“.NET Framework 4”

自定义布局的基类

LayoutEngine 类为实现布局引擎提供基类。 TableLayoutPanelFlowLayoutPanel 控件使用 LayoutEngine 类来提供布局行为。 有关更多信息,请参见如何:实现自定义布局引擎

标准设计器

Windows 软件开发包 (SDK) 提供了一组设计器以支持特定的组件类型。 这些设计器根据它们设计的组件命名,并以 Designer 一词作为后缀。 例如,Control 类的设计器是 ControlDesigner

通用设计器功能

从设计器访问设计时服务

通过传递要请求的服务类型,使用 GetService 方法可以请求大多数类型的设计时服务。 ComponentComponentDesigner 上有一个 GetService 方法。 IServiceProvider 上也有一个 GetService 方法,该方法由设计模式中的 IComponentSite 属性返回的 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 特性指定要与组件关联的设计器的类型。 派生组件普遍具有扩展基设计器的设计器。

有关更多信息,请参见如何:实现控件的设计器

扩展设计器

  1. 定义从基设计器类派生的类。

  2. 通过应用 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 {}
}

备注

如果为密封类定义设计器,或者不希望其他类使用或继承设计器,可以使设计器类成为程序集的内部类。设计器宿主仍然能够创建设计器的实例,但它不会构成公共对象模型。

请参见

任务

如何:访问设计时服务

如何:在 Windows 窗体中访问设计时支持

概念

元数据筛选

设计器谓词

如何:实现控件的设计器

其他资源

自定义设计器