如何通过DLL引用为Windows Form添加带自定义属性的C#控件
创建带自定义属性的WinForms控件DLL完整指南
一、选择正确的项目类型
在Visual Studio中,直接创建Windows Forms Control Library项目(针对.NET Framework);如果用.NET 5/6+,选Class Library,之后手动安装Microsoft.WindowsDesktop.App.WindowsForms NuGet包,引入WinForms依赖。
二、实现自定义控件(以RoundedButton为例)
- 删除项目默认的
UserControl1.cs,右键项目→添加→类,命名为RoundedButton,让它继承自原生Button。 - 编写代码添加自定义属性并重绘控件:
using System.Drawing; using System.Windows.Forms; namespace CustomWinFormsControls { public class RoundedButton : Button { // 自定义字段 private bool _lightUpOnHover = true; private Color _lightUpColor = Color.LightBlue; private int _rounded = 10; // 自定义属性,带分类和描述(属性面板可见) [Category("Custom Settings")] [Description("开启/关闭鼠标悬停高亮效果")] public bool LightUpOnHover { get => _lightUpOnHover; set { _lightUpOnHover = value; Invalidate(); // 修改后触发重绘 } } [Category("Custom Settings")] [Description("悬停时的高亮颜色")] public Color LightUpColor { get => _lightUpColor; set { _lightUpColor = value; Invalidate(); } } [Category("Custom Settings")] [Description("圆角半径(单位:像素)")] public int Rounded { get => _rounded; set { _rounded = value > 0 ? value : 0; Invalidate(); } } // 重写OnPaint实现圆角和高亮逻辑 protected override void OnPaint(PaintEventArgs pevent) { var g = pevent.Graphics; g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; // 根据状态确定背景色 var bgColor = BackColor; if (LightUpOnHover && ClientRectangle.Contains(PointToClient(MousePosition))) { bgColor = LightUpColor; } // 绘制圆角背景 using (var brush = new SolidBrush(bgColor)) using (var path = new System.Drawing.Drawing2D.GraphicsPath()) { path.AddArc(0, 0, Rounded, Rounded, 180, 90); path.AddArc(Width - Rounded, 0, Rounded, Rounded, 270, 90); path.AddArc(Width - Rounded, Height - Rounded, Rounded, Rounded, 0, 90); path.AddArc(0, Height - Rounded, Rounded, Rounded, 90, 90); path.CloseAllFigures(); g.FillPath(brush, path); } // 绘制按钮文字 TextRenderer.DrawText(g, Text, Font, ClientRectangle, ForeColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter); } // 鼠标移动/离开时触发重绘,更新高亮状态 protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (LightUpOnHover) Invalidate(); } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); if (LightUpOnHover) Invalidate(); } } }
三、编译生成DLL
右键项目→生成(或重新生成),在项目的bin/Debug或bin/Release目录下就能拿到编译好的.dll文件。
四、在WinForms项目中使用自定义控件
- 打开目标WinForms项目,右键工具箱→选择项→浏览,找到刚才生成的DLL,选中后确认,自定义控件会自动出现在工具箱里。
- 像拖拽原生控件一样把
RoundedButton拖到窗体上,在属性面板的Custom Settings分类下就能看到你定义的LightUpOnHover、LightUpColor、Rounded属性,直接修改即可生效。
五、扩展到其他控件(如复选框)
和按钮逻辑一致:创建RoundedCheckBox类继承自CheckBox,添加相同的自定义属性,重写OnPaint方法实现圆角和高亮效果,核心绘制逻辑可参考按钮的实现。
注意事项
- 自定义属性需添加
[Category]和[Description]特性,这样在属性面板里会分类显示并附带说明,提升易用性。 - 修改属性后必须调用
Invalidate()触发控件重绘,确保界面实时更新。 - 若使用.NET 6+的Class Library项目,务必先安装
Microsoft.WindowsDesktop.App.WindowsFormsNuGet包,否则无法引用WinForms相关类。
内容的提问来源于stack exchange,提问作者eclipz
相关产品推荐
相关产品推荐

