自定义控件(Windows 窗体 .NET)

可使用 Windows 窗体开发和实现新的控件。 可以创建新的用户控件,通过继承来修改现有控件,或编写可自行绘制的自定义控件。 本文重点介绍各种可继承控件之间的差异,并提供有关如何为项目选择某种特定控件的信息。

重要

面向 .NET 7 和 .NET 6 的桌面指南文档正在撰写中。

基控件类

Control 类是 Windows 窗体控件的基类。 它提供了在 Windows 窗体应用程序中进行可视化显示所需的基础结构,并提供了以下功能:

  • 公开窗口句柄。
  • 管理消息路由。
  • 提供鼠标和键盘事件,以及许多其他用户界面事件。
  • 提供高级布局功能。
  • 包含特定于可视化显示的多个属性,如 ForeColorBackColorHeightWidth

由于基类提供了大量基础结构,因此开发你自己的 Windows 窗体控件相对比较简单。

创建自己的控件

可以创建三种类型的自定义控件:用户控件、扩展控件和自定义控件。 下表可帮助你确定应创建的控件类型:

如果出现如下情况 创建以下内容
  • 你想要将多个 Windows 窗体控件的功能组合到单个可重用单元。
通过从 System.Windows.Forms.UserControl 继承来设计用户控件
  • 大部分所需功能与现有的 Windows 窗体控件相同。
  • 你不需要自定义图形用户界面,或者想为现有控件设计一个新的图形用户界面。
通过从某一特定 Windows 窗体控件继承来扩展控件
  • 你想要提供控件的自定义图形表示形式。
  • 你需要实现不能通过标准控件实现的自定义功能。
通过从 System.Windows.Forms.Control 继承来创建自定义控件

用户控件

用户控件是作为单个控件提供给使用者的 Windows 窗体控件的集合。 此类控件称为复合控件。 其包含的控件称为构成控件

用户控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许选择性地公开和绑定它们的属性。 用户控件还提供了大量的默认键盘处理功能,用户不需要进行任何额外的开发。

例如,可以生成用户控件,以显示来自数据库的客户地址数据。 此控件将包括用于显示数据库字段的 DataGridView 控件、用于处理到数据源的绑定的 BindingSource,以及用于在记录之间移动的 BindingNavigator 控件。 可以选择性地公开数据绑定属性,还可以将整个控件打包并在不同应用程序之间重复使用。

有关详细信息,请参阅用户控件概述

扩展控件

你可以从任何现有的 Windows 窗体控件派生继承的控件。 使用此方法,你可以保留 Windows 窗体控件的所有固有功能,然后通过添加自定义属性、方法或其他功能来扩展该功能。 可以使用此选项重写基控件的绘制逻辑,然后通过更改该控件的外观来扩展其用户界面。

例如,可以创建一个由 Button 控件派生的控件,并用它来跟踪用户的单击次数。

在某些控件中,也可以通过重写基类的 OnPaint 方法为控件的图形用户界面添加自定义外观。 对于跟踪单击次数的扩展按钮,可以重写 OnPaint 方法以调用 OnPaint 的基实现,然后在 Button 控件的工作区的一角绘制单击计数。

自定义控件

创建控件的另一种方法是通过从 Control 继承,从头开始充分创建一个控件。 Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供特定于控件的功能或图形界面。

相比从 UserControl 或现有 Windows 窗体控件继承来说,通过从 Control 类继承来创建控件需要花费更多心思和精力。 由于用户还需执行大量的实现,因此,控件可以具有比复合控件或扩展控件更好的灵活性,而且可以使控件完全满足自己的需要。

要实现自定义控件,必须为控件的 OnPaint 事件编写代码,它控制着控件的视觉绘制方式。 还必须为控件编写任何特定于功能的行为。 还可以重写 WndProc 方法并直接处理窗口消息。 这是创建控件的最强大的方法,但若要有效地使用此技术,需熟悉 Microsoft Win32® API。

时钟控件即是一个自定义控件,它复制模拟时钟的外观和行为。 调用自定义绘制来使指针移动,以响应来自内部 Timer 组件的 Tick 事件。

自定义设计体验

如果需要实现自定义设计时体验,可以创作自己的设计器。 对于复合控件,从 ParentControlDesignerDocumentDesigner 类派生自定义设计器类。 对于扩展控件和自定义控件,从 ControlDesigner 类派生自定义设计器类。

使用 DesignerAttribute 将控件与设计器关联。

以下信息已过时,但可能会对你有所帮助。