C#中的自定义组件(单一组件和复杂组件)

news2024/12/24 4:01:09

  简单的应用程序开发可能不必要制作组件,C#中丰富的组件足以应对绝大多数的开发设想。

  稍微复杂一些的应用开发,或者平台开发,或者团队开发,不可避免地要涉及到基础库的搭建,其中会有很多用户组件的设计与开发。

  组件分可视化与非可视化,这里主要涉及的是可视化的组件。

  可视化的组件一般分单一组件,就是继承自某一个单独的类,然后进行开发;复杂一些的就是继承自用户组件(windows窗体),这里可以完成丰富的功能。

  一、简单的用户组件

  比如我想制作一个按钮,当这个按钮获取焦点时显示一种(图片)状态,当这个按钮失去焦点时显示另外一种(图片)状态,当然可以设定更多的状态(鼠标按下),处理的方法类似,具体操作过程:

  1、制作两张图片

  2、 将两张图片放到项目(资源文件)中,这样编译时可以一起打包,不放也可以,需要在发行时随程序文件一起发行。

  3、创建类UserButton.cs,编写代码

  继承自PictureBox,然后编写具体的代码:

    public partial class UserButton : PictureBox
    {
        private string imageNormal = "";
        private string imageFocus = "";

        public string ImageNormal
        {
            get { return imageNormal; }
            set
            {
                imageNormal = value;
                //设置正常显示时的图片
                if (!string.IsNullOrEmpty(ImageFocus))
                {
                    Image = Image.FromFile(imageNormal);
                }
            }
        }

        public string ImageFocus
        {
            get { return imageFocus; }
            set
            {
                //设置按钮获取焦点时的图片
                imageFocus = value;
            }
        }

        protected override void OnMouseEnter(EventArgs e)
        {
            base.OnMouseEnter(e);
            //鼠标移入时更换显示图片
            if (!string.IsNullOrEmpty(ImageFocus))
            {
                Image = Image.FromFile(imageFocus);
            }
        }

        protected override void OnMouseLeave(EventArgs e)
        {
            base.OnMouseLeave(e);
            //鼠标移出,失去焦点时恢复默认的图片
            Image = Image.FromFile(imageNormal);
        }

        protected override void OnClick(EventArgs e)
        {
            base.OnClick(e);
            //执行相应的动作
        }
    }

  4、生成,如果没有错误,那么在工具箱中可以看到UserButton;

  5、测试,在窗体中,放入一个UserButton,在窗体初始化中加入下面的代码即可看到效果:

            userButton1.ImageFocus = "D:\\CSharp\\images\\IconSystemFocus.png";
            userButton1.ImageNormal = "D:\\CSharp\\images\\IconSystemNormal.png";

  二、复杂的用户组件

  这里复杂的用户组件就是封装了很多的Windows组件或者用户组件,这些组件可以相互通讯也可以与外面的组件进行通讯,完成更多复杂的功能。

  比如,完成一个搜索用户组件,用户组件上包含了一个文本框和一个自定义的按钮。具体的操作步骤如下:

  1、新建用户组件UserSeach,选择基于“用户组件(windows窗体)”;

  2、放置一个文本框(Textbox)和用户自定义组件(UserButton);

  3、用户组件外面需要访问文本框和按钮,定义:

        public UserButton MyUserButton {
            get { return userButton1; }
        }
        public TextBox MyTextbox {
            get { return textBox1; }
        }

  4、用户组件外面需要相应按钮点击事件,定义:

       public event EventHandler MyUserButtonClicked;

        private void userButton1_Click(object sender, EventArgs e)
        {
            //在用户组件内的响应处理;
            MyUserButtonClicked?.Invoke(this,EventArgs.Empty);
        }

  5、生成,如果没有错误,那么在工具箱中会出现UserSeach用户组件;

  6、在窗体中放入UserSeach用户组件,编写代码:

  ⑴在窗体中定义

        UserButton mineUserButton;
        TextBox mineTextbox;

  ⑵定义一个按钮事件响应:

        private void UserSreach1_MyUserButtonClicked(object? sender, EventArgs e)
        {
            MessageBox.Show("响应代码");
        }

  ⑶在窗体初始化时进行赋值与事件挂载:

            mineUserButton = userSreach1.MyUserButton;
            mineTextbox = userSreach1.MyTextbox;
            
            mineUserButton.ImageFocus= "D:\\CSharp\\IconSystemFocus.png";
            mineUserButton.ImageNormal = "D:\\CSharp\\IconSystemNormal.png";
            userSreach1.MyUserButtonClicked += UserSreach1_MyUserButtonClicked;

  7、可以看到正确的效果。

  在1998年使用PowerBuilder时经常要用到自定义组件,有5种,非可视化的三种(单一的、复杂的,WatcomC编写的),可视化的两种(单一的、复杂的),制作自定义组件非常方便,不需要进行编译就可以使用,快捷便利,唯一注意点是不能在用户组件编辑时打开嵌套了用户组件的窗体或者组件。

  组件内的控件与外界通讯也很方便,就是自定义一个中间事件作为桥梁,组件内控件触发这个中间事件,在窗体内应用时直接在中间事件内进行编写代码即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/706510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉 - 理论 - 从卷积到识别

计算机视觉 - 理论入门 前言一,导论:二,卷积:图像去噪:常值卷积:高斯卷积:椒盐去噪:锐化程度: 三,边缘检测:图像信号导数:求导算子:图…

计算机网络-网络层上篇

目录 一、网络层概述 二、网络层提供的两种服务 (一)面向连接的虚电路服务 (二)无连接的数据报服务 (三)虚电路服务与数据报服务的比较 三、IPv4地址及其应用 (一)IPv4地址概…

【AI底层逻辑】——篇章4:大数据处理与挖掘

目录 引入 一、大数据概述 二、数据处理的流程&方法 1、数据收集——“从无到有” 2、数据加工——“从有到能用” 3、数据分析 三、大数据改变了什么 往期精彩: 引入 AI的表现依赖大数据。曾经一段时间,对于图像识别的准确率只能达到60%~70…

BUUCTF 还原大师 1

题目描述: 我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4D…

Elasticsearch 集群日志收集搭建

Elasticsearch-7.2.0Logstash-7.2.0Kibana-7.2.0-Filebeat-7.6.0 第一台集群内网ip:10.0.0.223 ES配置文件:/es_data/es/elasticsearch-7.2.0/config/elasticsearch.yml ES启动命令:/es_data/es/elasticsearch-7.2.0/bin/elasticsearch cl…

报道|本科专业对收入影响巨大!最高以及最低收入的专业有这些

作者:Aimee Picchi 编者按 本文引用并翻译了发表在美国CBS的最新研究,希望能给刚高考完正在挑选大学以及专业的准大学生们一点帮助哦。 最新的研究发现,一个学生的专业和母校能明显地影响ta毕业四年后的收入水平。HEA Group的调查显示&#x…

Jenkins + gitlab 自动部署

1. 背景 作为后台开发,每次我们开发完或者修改一个bug后都要手动合并,打包或者连接服务器执行打包部署命令,每次手动操作,极大的影响了我们的开发效率,那么有没有一款工具能让我们只需要推送/合并代码到远端就能实现服…

【小沐学Python】Python实现Web服务器(Flask框架扩展:Flask-SQLAlchemy)

文章目录 1、简介2、安装3、开发3.1 数据库连接字符串3.2 SQLAlchemy参数设置3.3 SQLAlchemy字段类型3.4 SQLAlchemy列选项3.5 SQLAlchemy关系选项3.6 SQLAlchemy操作接口 4、代码测试4.1 用户管理4.2 用户角色管理4.3 学生管理4.4 图书管理 结语 1、简介 SQLAlchemy SQLALche…

windows下安装Visual Studio + CMake+OpenCV + OpenCV contrib+TensorRT

目录 1 安装visual studio 2 安装CMake 3 OpenCV源码安装 3.1 OpenCV源码下载 3.2 OpenCV contrib源码下载 3.3 安装OpenCV 3.4 安装OpenCV-crontrib 3.5 VS生成代码 4 环境配置 5 TensorRT安装 5.1 TensorRT安装 5.2 Python下安装TensorRT库 最近在研究windows系统…

Android学习_Mars老师之Mp3视频开发

实现的功能&#xff1a;开发一个可以播放音乐并同步显示歌词文件的APP. 成果展示&#xff1a; 总体设计图&#xff1a; 实现流程图 代码展示&#xff1a; AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:androi…

信道编码:MATLAB使用卷积编译码函数

信道编码&#xff1a;MATLAB 使用Conv函数 1. 相关函数 在进行卷积编码的过程中&#xff0c;使用的函数是convenc()函数和vitdec()函数&#xff0c;同时需要poly2trellis()函数。 1.1 poly2trellis()函数 先看poly2trellis()函数,用来生成卷积编码所需要的网表。 trellis …

svn commit 用法

转载   原文&#xff1a;https://blog.csdn.net/qq_39790633/article/details/103700391 使用svn进行代码的提交有两种方法&#xff1a;一种是通过TortoiseSVN客户端界面进行提交&#xff0c;另一种是通过svn commit指令提交。 方法一&#xff1a;通过TortoiseSVN客户端界面提…

【Python 随练】文本颜色设置

题目&#xff1a; 文本颜色设置 简介&#xff1a; 在本篇博客中&#xff0c;我们将学习如何在Python中设置文本的颜色。我们将介绍一个常用的库&#xff0c;并提供代码示例来演示不同颜色的设置。 问题分析&#xff1a; 我们需要在Python中设置文本的颜色&#xff0c;以增…

3.2迷宫求解

首先我没 看懂数据结构书上写得迷宫 求解 不过 不重要了 迷宫求解 需要先有个 迷宫 游戏 以下 是 Java写的 控制台迷宫游戏 import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern;public class MazeGameJ {public static void main(St…

云原生|kubernetes|centos7下离线化部署kubesphere-3.3.2---基于kubernetes-1.22.16(从网络插件开始记录)

前言&#xff1a; kubesphere的离线化部署指的是通过自己搭建的harbor私有仓库拉取镜像&#xff0c;完全不依赖于外部网络的方式部署。 我的kubernetes集群是一个单master节点&#xff0c;双工作节点&#xff0c;总计三个节点的版本为1.22.16的集群。 该集群只是初始化完成了…

在Excel当前窗口显示最后一行数据

大家也许都知道Excel工作表中数据行数较多&#xff0c;使用<Ctrl下箭头>组合键可以快速定位最后一行&#xff0c;但是如果数据不是连续的&#xff08;也就是工作表中包含空行&#xff09;&#xff0c;这个方式就只能定位到当前连续数据区域的最后一行。 如下实例代码可以…

Visual Studio2019更改并下载.Net Framework目标框架

一、问题 当使用.net进行开发时&#xff0c;开发的项目与.net framework目标框架会非常密切相关的&#xff0c;所以当vs本地使用的.net framework框架与该项目工程的框架不一致的时候&#xff0c;就可能打开不了当前项目&#xff0c;解决这个问题的方法有&#xff1a; 第一种…

方向导数和梯度

理性认识的三个阶段&#xff1a;定义、判断、推理。 有位博主说过&#xff0c;数学中&#xff0c;定义占60%的内容。 方向导数定义如下&#xff1a; 注意的一点是&#xff1a; 该处的alpha&#xff0c;beta角度关系是alpha beta pi/2。t*cos alpha &#xff0c;t * cos …

两百行代码实现简易点云标注工具

夏天来了非常热&#xff0c;LZ周末不想出去玩&#xff0c;于是乎继之前的图片标注工具利用两个晚上写了一个简单的点云标注工具。该工具基于Qt5.14.2-msvc2017&#xff08;其实LZ的VS版本是2019&#xff0c;似乎兼容&#xff09;平台C语言开发&#xff0c;用到的第三方库为PCL1…

ModaHub魔搭社区:“百模大战”下,字节跳动选择做一个“大模型商场”

“火山方舟”面向企业提供模型精调、评测、推理等全方位的平台服务&#xff08;MaaS&#xff0c;即Model-as-a-Service&#xff09;&#xff0c;目前集成了百川智能、出门问问、复旦大学MOSS、IDEA研究院、澜舟科技、MiniMax、智谱AI等多家AI科技公司及科研团队的大模型。 这种…