在 WinForms 中创建自定义控件最推荐使用 UserControl:它可可视化设计、封装逻辑、暴露属性/事件,编译后自动出现在工具箱,支持拖拽使用和设计器友好配置。

在 WinForms 中创建自定义控件,最常用、最推荐的方式是使用 用户控件(UserControl)。它本质是一个可复用的“子窗体”,能封装界面和逻辑,拖拽到主窗体就像用 Button 或 TextBox 一样方便。
一、新建用户控件(.cs 文件 + 设计器)
在 Visual Studio 解决方案资源管理器中右键项目 → “添加” → “新建项” → 选择 “用户控件”(模板名通常为 UserControl),输入名称(如 MyNumberBox.cs)。VS 会自动生成:
-
MyNumberBox.cs(代码文件,继承自UserControl) -
MyNumberBox.Designer.cs(设计器生成的初始化代码) -
MyNumberBox.resx(资源文件)
双击打开即可在可视化设计器里拖放按钮、文本框等控件,和设计窗体完全一样。
二、暴露有用的属性和事件
默认 UserControl 是“黑盒”,外界无法访问内部控件。要让使用者能设置值、响应操作,需手动公开属性和事件:
- 用
public属性包装内部 TextBox 的Text或Value(比如做数字输入框时暴露Value属性并做类型转换) - 用
public event EventHandler声明自定义事件(如ValueChanged),并在内部 TextBox 的TextChanged或Leave中触发它 - 别忘了给属性加
[Category]和[Description]特性,这样在属性面板里会分类显示、带提示
三、在主窗体中使用你的用户控件
编译项目后,你的 UserControl 会自动出现在工具箱底部(可能需要重启 VS 或右键工具箱 → “选择项…” → 勾选你的控件)。之后就可以:
- 直接从工具箱拖到 Form 上
- 在代码中 new 实例并 Add 到 Controls 集合(
this.Controls.Add(new MyNumberBox());) - 在属性窗口设置你暴露的属性,双击事件空白处快速生成事件处理方法
四、进阶:支持设计器中的实时预览与智能提示
如果想让用户控件在设计器里更友好(比如显示默认标题、支持缩略图、支持 Tab 键顺序),可以:
- 重写
GetPreferredSize(Size)控制默认大小 - 添加
[ToolboxItem(true)]和[DefaultEvent("ValueChanged")]等特性 - 在构造函数中调用
InitializeComponent()后设置合理默认值(如this.Text = "MyNumberBox";) - 避免在构造函数中做耗时操作或依赖窗体句柄(
this.Handle可能还没创建)
基本上就这些。用户控件不是魔法,就是把一堆标准控件+逻辑打包成一个可重用单元,关键在于接口设计清晰、行为稳定、符合 WinForms 开发习惯。










