自定义控件
自定义控件分为以下三种
- 复合控件:将标准控件组合起来
class YourControl: UserControl{}
- 扩展控件:继承于标准控件
class YourControl: Button{}
- 自定义控件:完全地自定义一个控件
class YourControl: Control {}
1.复合控件
复合控件是将标准控件组合起来,作为新的控件
复合控件又叫做用户控件
1.1 创建复合控件
资源管理器中右键=》添加=》用户控件,可以打开创建用户控件的页面
或者点击创建项,找到用户控件

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

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

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

1.2 使用复合控件
在创建并设计好复合控件后,以下要点缺一不可
- 工具=》选项=》winows窗口设计器=》常规=》工具箱=》自动填充工具箱设置为True (仅设置一次)
- 生成=》重新生产解决方案=》关闭并重新打开Form1.cs (每当复合控件代码改动都要执行此步骤)
以上步骤都ok后,可以看到工具箱中已经有我们的控件了,直接拖动到窗口控件中

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使用我们的控件时,可以在属性栏中的杂项中看到这些属性

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)]| 属性值 | 枚举值 | 描述 |
|---|---|---|
| Content | 2 | 代码生成器产生对象内容的代码,而不是对象本身的代码。 |
| Hidden | 0 | 代码生成器不生成对象的代码。 |
| Visible | 1 | 代码生成器生成对象的代码。 |
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);
}重新生产解决方案后,就可以在事件工具栏中看到我们自定义的事件了

双击进入事件代码,可以在此函数中书写相应逻辑
c#
private void searchBox1_SearchEvent(object sender, EventArgs e)
{
MessageBox.Show(searchBox1.Text);
}代码执行的顺序为

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

