Skip to content

自定义控件

自定义控件分为以下三种

  • 复合控件:将标准控件组合起来
    • class YourControl: UserControl{}
  • 扩展控件:继承于标准控件
    • class YourControl: Button{}
  • 自定义控件:完全地自定义一个控件
    • class YourControl: Control {}

1.复合控件

复合控件是将标准控件组合起来,作为新的控件

复合控件又叫做用户控件

1.1 创建复合控件

资源管理器中右键=》添加=》用户控件,可以打开创建用户控件的页面

或者点击创建项,找到用户控件

image-20250113150153693

定义符合控件的名称点击创建

image-20250113150325661

创建好之后可以看到用户控件的文件已经出现在资源管理器中,并且有业务代码、界面代码、资源文件

image-20250113150415111

向复合控件中添加组件和之前一样,可以拖动,也可以在代码中自己书写

image-20250113150452873

1.2 使用复合控件

在创建并设计好复合控件后,以下要点缺一不可

  • 工具=》选项=》winows窗口设计器=》常规=》工具箱=》自动填充工具箱设置为True (仅设置一次)
  • 生成=》重新生产解决方案=》关闭并重新打开Form1.cs (每当复合控件代码改动都要执行此步骤)

以上步骤都ok后,可以看到工具箱中已经有我们的控件了,直接拖动到窗口控件中

image-20250113150911814

1.3 自定义属性

打开复合控件的业务代码文件,可以直接定义自定义属性

c#
public partial class SearchBox : UserControl
{
    public SearchBox()
    {
        InitializeComponent();
    }
    public int Xyz {
        set; get;
    }
    
    public string SearchText
    {
        get
        {
            return textBox1.Text;
        }
        set
        {
            textBox1.Text = value;
        }
    }

}

以上代码随便定义了一个Xyz属性,又定义了一个SearchText属性用于获取和修改文本框的文本值

注意:每当复合控件代码改动,都要重新生成解决方案,然后关闭并重新打开Form1.cs

定义好自定义属性后,打开Form1.cs使用我们的控件时,可以在属性栏中的杂项中看到这些属性

image-20250113151725765

1.3.1 自定义属性特性

自定义属性可以添加以下特性

1.控制改自定义属性是否在工具栏中显示,true | false

c#
[Browsable(true)]

2.控制自定义属性显示在属性工具栏中的分类

c#
[Category("Appearance")]
属性值描述
Action操作
Asynchronous异步
Appearance外观
Behavior行为
Data数据
Default杂项
Design设计
DragDrop拖放
Focus焦点
Format格式
Key
Layout布局
Mouse鼠标
WindowStyle窗口样式

3.控制当工具栏中数据改动,会不会自动修改相应代码

c#
[DesignerSerialization Visibility(DesignerSerialization.Visibility.Visible)]
属性值枚举值描述
Content2代码生成器产生对象内容的代码,而不是对象本身的代码。
Hidden0代码生成器不生成对象的代码。
Visible1代码生成器生成对象的代码。

1.4 自定义事件

自定义事件涉及到c#中的委托与事件

在上面实例中,我们想给图片框添加一个点击事件

需要先在复合控件中定义一个事件,在图片被点击时调用这个事件

c#
public event EventHandler SearchEvent;     // 定义自定义事件

private void pictureBox1_Click(object sender, EventArgs e)			// 点击时间被调用时,调用自定义事件
{
    if (SearchEvent != null) {
        SearchEvent.Invoke(this, e);
    }
    // 可简写为
    // SearchEvent?.Invoke(this, e);
}

重新生产解决方案后,就可以在事件工具栏中看到我们自定义的事件了

image-20250113160850643

双击进入事件代码,可以在此函数中书写相应逻辑

c#
private void searchBox1_SearchEvent(object sender, EventArgs e)
{
    MessageBox.Show(searchBox1.Text);
}

代码执行的顺序为

image-20250113161250532

1.5 案例演示

以上案例可以把textBox的边框去除,效果如下

PixPin_2025-01-13_16-17-15

2.扩展控件

3.自定义控件

MIT Licensed