当前位置: 首页 > news >正文

c# 中的UserControl是什么 用户控件和自定义控件有什么区别

 

用户控件是许多控件的集成
自定义控件是自己写一个控件类,或者继承已有的控件类

复合控件是封装在公共容器内的 Windows 窗体控件的集合。这种控件有时称为“用户控件”。包含的控件称为“构成控件”。 

复合控件包含与每个包含的 Windows 窗体控件相关联的所有固有功能,允许您有选择地公开和绑定它们的属性。复合控件还提供了大量的默认键盘处理功能,您不需要任何额外的开发。 
==================================== 
自定义控件 
创建控件的另一种方法是通过从 Control 继承从头开始创建一个控件。Control 类提供控件所需的所有基本功能(包括鼠标和键盘处理事件),但不提供控件特定的功能或图形界面。 

与通过从 UserControl 或现有 Windows 窗体控件继承创建控件相比,通过从 Control 类继承创建控件需要耗费更多的心思和精力。由于大量的实现将留给您进行,因此,您的控件可以具有比复合控件或扩展控件更大的灵活性,而且您可以使控件完全满足自己的需要。

 

作为创建控件的起点,有两个类分别用于不同的情况。理解这两个类的结构,有助于确定什么场合应使用哪个类。

 

1、Control类

Control类包含在System.Windows.Forms名称空间中,其基本功能包括:在屏幕上定义一个矩形区域,给它提供一个句柄,处理常规的系统消息。这样,Control类就可以处理用户通过键盘和鼠标输入的信息。Control类可以用作组件的基类,这些组件需要在Win32类型的图形界面上可视化地显示出来。除了内置控件和从Control类派生的控件外,Form类归根结底也是从Control类派生的。

除了这些低层次的窗口显示功能之外,Control类也包含像Font、ForeColor、BackColor和BackGroundImage这种与可视化有关的属性。Control类还有其他用于管理控件在窗体上的布局的属性,例如Docking属性和Anchoring属性。

Control类不包含任何在屏幕上显示的逻辑,但可以指定背景色或显示背景图像。它不包含任何输入处理逻辑,但提供了对键盘和鼠标的访问,可以生成标准的控件事件,如Click和KeyPress。开发人员在根据Control类创建自定义控件时,除了Control类提供的基本功能之外,还必须提供所有这些功能。

Control类提供了一组标准的事件,包括单击(Click、DoubleClick)事件、按键事件(KeyUp、KeyPress、KeyDown)、鼠标事件(MouseUp、MouseHover、MouseDown等)以及处理拖放操作的事件(DragEnter、DragOver、DragLeave、DragDrop)。另外,还有管理控件中焦点和验证的标准事件(GotFocus、Validating、Validated)。

 

2、UserControl类

对于从头创建的控件来说,Control类的内置功能是很重要的基础,这些新控件带有自己的显示和键盘处理逻辑。然而,Control类不用作其他控件的容器。

这意味着复合控件不能使用Control类作为起点。复合控件组合两个或两个以上的现有控件,因而起点必须是能管理被包含的控件。满足这种需求的类是UserControl。因为它最终从Control类派生,所以具有该类的所有属性、方法和事件。

然而,UserControl类并不直接从Control类派生。它从ContainerControl类派生,ContainerControl类从ScrollableControl类派生。

顾名思义,ScrollableControl类支持滚动控件窗口的客户区。这个类中几乎所有的成员都与滚动相关。例如,AutoScroll用于打开或关闭滚动,像AutoScrollPosition这样的控制属性用于获取和设置可滚动区域中的位置。

ContainerControl类从ScrollableControl派生,并增加了支持和管理子控件的功能。它管理焦点和控件之间的跳转能力。它的属性有ActiveControl,用于指向带焦点的控件;以及Validate,用于验证最近修改的、没有引发其验证事件的控件。

ScrollableControl和ContainerControl通常都不能直接继承。但它们增加的功能是其更常用的子类Form和UserControl所需要的。

UserControl类能够包含其他的子控件,但是UserControl的界面不会显示这些子控件。UserControl的界面用于给外面的客户显示一个单独、统一的界面,例如窗体或容器控件。任何需要访问子控件的对象界面必须在自定义控件中实现。

相关文章:

  • PHP实现懒加载
  • 漂亮的ActionBar效果
  • Entity Framework 的事务 DbTransaction
  • Android中的Unable to start activity ComponentInfo或者Unable to instantiate activity ComponentInfo的错误...
  • HTTP 方法:GET 对比 POST
  • 移动web开发中,好用的小方法
  • Resx 文件无效,未能加载 .RESX 文件中使用的类型
  • JDK中文方框乱码问题
  • 32 脚本编程风格
  • 让低版本的 Android 项目显示出 Material 风格的点击效果
  • eclipse安装pydev插件时没有任何错误提示,但是就是装完了后不显示pydev的设置项...
  • bzoj2337
  • android sqlite 数据类型
  • 来一篇新鲜的招聘笔试题(2014秋招版)
  • 接口和实现分离的好处
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • ES学习笔记(12)--Symbol
  • js面向对象
  • Just for fun——迅速写完快速排序
  • KMP算法及优化
  • MySQL用户中的%到底包不包括localhost?
  • storm drpc实例
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 服务器之间,相同帐号,实现免密钥登录
  • 回顾 Swift 多平台移植进度 #2
  • 聊聊redis的数据结构的应用
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 为视图添加丝滑的水波纹
  • 我的业余项目总结
  • 详解NodeJs流之一
  • 原生 js 实现移动端 Touch 滑动反弹
  • #NOIP 2014#Day.2 T3 解方程
  • #pragma 指令
  • #Z2294. 打印树的直径
  • #宝哥教你#查看jquery绑定的事件函数
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (solr系列:一)使用tomcat部署solr服务
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • (轉貼) VS2005 快捷键 (初級) (.NET) (Visual Studio)
  • .NET 4.0中的泛型协变和反变
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • @Pointcut 使用
  • @在php中起什么作用?
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [1204 寻找子串位置] 解题报告
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强