













在实际应用开发中,可能UI框架的默认控件,已经不能满足实际的应用需求,或者某些功能被大量的重复应用,如果每一个使用的地方都书写大量的重复代码,则不仅会浪费精力,且让维护变得复杂,此时就需要将包含特定功能的部分封装成控件,便于重复使用。自定义控件就像造轮子,轮子造好以后,别的地方可以一键复用。今天我们以一些简单的小例子,简述基于.NET的Windows窗体编程中自定义控件的相关应用,仅供学习分享使用,如有不足之处,还请指正。

一般而言,自定义控件,是在Visual Studio提供的默认控件不能满足实际的工作需要,才需要在现有控件的基础之上进行新的扩展,来实现自己的功能。自定义控件有自己特有的属性,事件,方法来支撑特定的功能。自定义控件封装实现的细节,可以进行方便的复用。自定义控件主要有以下三种分类,本例采用的是第三种。
今天主要讲解用户控件,至于扩展控件和自定义控件,在后续篇幅继续讲解。
用户控件是封装在通用容器中的 Windows 窗体控件的集合。 此类控件称为 复合控件。 其包含的控件称为构成控件。 复合控件派生自 UserControl 类。自定义的复合控件可以在创建它们的项目中使用,也可以在引用这些用户控件库的其他项目中使用。用户控件的代码实现模式是:
由于用户控件可以在创建它的项目中使用,也可也可以在引用这些用户控件库的其他项目中使用,所以为了将用户控件单独存放,我们创建一个独立的用户控件库,并命名为“Okcoder.WinForm.UserControls”。选择控件库,然后点击右键,在弹出的快捷菜单中,选择“添加”,然后选择“用户控件(Windows窗体)(U)...”如下图所示:

在弹出的“添加新项”对话框中,选择“用户控件(Windows窗体)”,然后输入名称,点击“添加”按钮即可,如下图所示:

在本示例中,用户控件名称为“ClearableTextBox”,主要功能为设计一个可清除文本框。首先设计用户空间的页面,它包括如下几部分:
布局后页面,如下所示:

公开属性,打开用户控件的后台代码页面,添加两个属性,主要用于:
具体公开属性如下所示:
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public string Title
{
get => lblTitle.Text;
set => lblTitle.Text = value;
}
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public new string Text
{
get => txtValue.Text;
set => txtValue.Text = value;
}
事件转发,增加TextChanged事件,并将此事件注册到文本框的TextChanged事件中,当应用用户的控件程序注册TextChanged事件时,就可以响应文本框的文本变化。如下所示:
[Browsable(true)]
public new event EventHandler? TextChanged
{
add => txtValue.TextChanged += value;
remove => txtValue.TextChanged -= value;
}
封装逻辑行为,封装清除按钮的逻辑,为btnClear按钮增加Click事件的处理逻辑,如下所示:
private void btnClear_Click(object sender, EventArgs e)
{
Text = "";
}
用户控件创建完成,且项目编译成功后,在需要应用用户控件的项目引用控件库“Okcoder.WinForm.UserControls”,就可以在工具箱中,看到创建的自定义控件,然后拖动控件到Form表单中,如下所示:

分别设置拖动到页面的两个用户控件的标题为First Name,Last Name,然后注册两个控件的TextChanged事件,如下所示:

在Form表单的后台代码中,为用户控件的TextChanged事件添加处理逻辑,当用户内容发生变化时,将内容显示在名称为“lblFullName”的Lable上,如下所示:
namespace Okcoder.WinForm.Demo
{
public partial class FrmUserControls : Form
{
public FrmUserControls()
{
InitializeComponent();
}
private void UpdateNameLabel()
{
if (string.IsNullOrWhiteSpace(ctlFirstName.Text) || string.IsNullOrWhiteSpace(ctlLastName.Text))
lblFullName.Text = "Please fill out both the first name and the last name.";
else
lblFullName.Text = $"Hello {ctlFirstName.Text} {ctlLastName.Text}, I hope you're having a good day.";
}
private void ctlFirstName_TextChanged(object sender, EventArgs e)
{
UpdateNameLabel();
}
private void ctlLastName_TextChanged(object sender, EventArgs e)
{
UpdateNameLabel();
}
private void FrmUserControls_Load(object sender, EventArgs e)
{
UpdateNameLabel();
}
}
}
运行实例,效果如下所示:

以上就是《基于.NET的Windows窗体编程之WinForms自定义控件(1)》的全部内容,旨在抛砖引玉,一起学习,共同进步!!!
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。