管理杂谈OA答疑ERP答疑教程搜索

基于.NET的Windows窗体编程之WinForms事件简介


在实际开发中,程序的核心是处理数据,它将收集到的数据进行加工处理等计算,再将结果呈现到软件页面上。所以系统不仅向用户展示数据,还会从用户收集数据,以实现双向交互(接收-处理-反馈)的闭环。程序与用户的交互,离不开事件的帮助,事件就像是程序与用户之间的桥梁,实现双方的完美对接。今天我们会以一些简单的小例子,简述基于.NET的Windows窗体编程中事件的相关内容,仅供学习分享使用,如有不足之处,还请指正。

概述

事件是在代码中可以响应或“处理”的操作。 事件通常由用户操作(如单击鼠标或按键)触发,但它们也可以由程序代码或系统生成。事件驱动的应用程序运行代码以响应事件。 每个窗体和控件都会公开一组预定义的事件,可以响应这些事件。 如果引发其中一个事件并且存在关联的事件处理程序,则调用处理程序并运行代码以完成相应的功能。
委托是 .NET 中通常用于生成事件处理机制的类。 委托大致等同于函数指针,但与函数指针不同的是,委托是面向对象的、类型安全的和保险的。 此外,函数指针仅包含对特定函数的引用,委托包含对对象的引用,以及对对象中的一个或多个方法的引用。事件模型使用 委托 将事件绑定到用于处理事件的方法,关于事件模型,主要有以下几点需要注意:

  1. 委托允许其他类通过指定处理程序方法来注册事件通知。 当发生事件时,委托会调用绑定的方法。
  2. 委托可绑定到单个方法或多个方法,后者又称为多路广播。 为事件创建委托时,通常会创建多播事件。多播委托维护绑定到它的方法的调用列表。
  3. 当应用程序触发事件时,控件通过调用该事件的委托来引发该事件。 委托依次调用绑定的方法。
  4. 委托还允许将多个事件绑定到同一个方法上,从而允许多对一通知。例如,按钮单击事件和菜单命令单击事件都可以调用相同的委托,然后调用单个方法以相同的方式处理这些单独的事件。
  5. 用于委托的绑定机制是动态的:委托可以在运行时与任何其签名与事件处理程序的签名匹配的方法绑定。 使用此功能,可以根据条件设置或更改绑定方法,并动态将事件处理程序附加到控件。

事件分类

控件通过基类 Control提供 60 多个事件。 其中包括 Paint 导致绘制控件的事件、与显示窗口相关的事件(如 Resize 和 Layout 事件)以及低级别鼠标和键盘事件。 某些低级别事件由Control合成为语义事件,例如Click和DoubleClick。 大多数共享事件属于以下类别:


关于事件,还有以下两点补充说明:

  1. 每次双击控件时都会引发Click事件。 例如,如果控件具有的Click 和 DoubleClick 事件的事件处理程序,则双击窗体并调用这两种方法时,将引发DoubleClick和Click事件。 如果双击某个控件,并且该控件不支持该 DoubleClick 事件,则可能会引发 Click 事件两次。
  2. 在用户按下键盘键时发生两个事件,在用户释放键盘键时发生一个事件。KeyDown 事件发生一次。KeyPress 事件,当用户按住同一个密钥时,可能会多次发生该事件。当用户释放密钥时,KeyUp 事件发生一次。

窗体的事件顺序

了解Windows 窗体应用程序中事件被引发的顺序,有助于依次处理每个事件。 当出现需要谨慎处理事件的情况时(例如,在重绘窗体的某些部件时),有必要了解运行时引发事件的确切顺序。 
Form 和 Control 类公开了一组与应用程序启动和关闭相关的事件。 Windows 窗体应用程序启动时,主窗体的启动事件将按照以下顺序引发:

  1. Control.HandleCreated,在为控件创建句柄时触发此事件。
  2. Control.BindingContextChanged,当 BindingContext 属性的值更改时发生。
  3. Form.Load,在第一次显示窗体前发生。
  4. Control.VisibleChanged,当 Visible 属性值更改时发生。
  5. Form.Activated,当使用代码激活或用户激活窗体时发生。
  6. Form.Shown,只要窗体是首次显示就发生。


应用程序关闭时,主窗体的关闭事件将按照以下顺序引发:

  1. Form.Closing,当窗体关闭时发生。此事件已过时,请采用 FormClosing 事件。
  2. Form.FormClosing,当窗体关闭时发生。
  3. Form.Closed,关闭窗体时发生。此事件已过时,请采用 FormClosed事件。
  4. Form.FormClosed,关闭窗体时发生。
  5. Form.Deactivate,当窗体失去焦点并不再是活动窗体时发生。


在主窗体关闭事件后,将引发Application类的ApplicationExit 事件。

窗体中的坐标

Windows 窗体的坐标系基于设备坐标,在 Windows 窗体中绘制时的基本度量单位是设备单位(通常为像素)。 屏幕上的点由 x 坐标和 y 坐标对描述,x 坐标向右增加,y 坐标从上到下增加。 原点相对于屏幕的位置会有所不同,具体取决于是指定屏幕还是客户端坐标。

客户区的尺寸也由一个包含该区域客户端坐标的 Rectangle 结构进行描述。 在所有情况下,矩形的左上角坐标包含在客户区中,而右下角坐标则不包括在内。 图形操作不包括工作区的右边缘和下边缘。 例如,FillRectangle 方法将填充到指定矩形的右边缘和下边缘,但不包括这些边缘。

有时,可能需要从屏幕坐标映射到客户端坐标。 可以使用 PointToClient 类中提供的 PointToScreen 和 Control 方法轻松实现此目的。 例如,MousePosition 的 Control 属性是以屏幕坐标表示的,但可能需要将其转换为客户端坐标。


事件示例

在Windows窗体编程中,最常用的就是Button(按钮)控件,它允许用户通过单击来执行某项操作。 Button 控件可以同时显示文本和图像。 单击该按钮时,看上去它像是被按下并释放。每当用户单击按钮时,就会调用Click事件处理程序,可以在 Click 事件处理程序中放置代码以执行选择的操作。

Button控件的关键属性与事件:

为Button按钮添加Click事件,具体步骤如下:

1. 在Form窗体中添加一个按钮控件,并命名为btnOk,设置Text属性为OK,如下所示:

2. 在属性窗口切换到事件Tab页(⚡️),在Click事件右侧的框中双击,VisualStudio设计器,会自动生成btnOk_Click事件处理方法,如下图所示:

3. 切换到Form窗体对应的类文件,便可以看到自动生成的事件处理方法,它包含两个参数:

默认btnOk_Click方法是空的,可以在其中编写需要被执行的代码,如:弹出一个对话框,提示点击了按钮,如下所示:

namespace Okcoder.WinForm.Demo{    public partial class FrmEventForm    {        public FrmEvent()        {            InitializeComponent();        }
        private void btnOk_Click(object sender, EventArgs e)        {            //点击事件被执行的代码            MessageBox.Show("你点击了OK按钮");        }    }}

通过Visual Studio调试运行程序,当点击按钮时,弹出一个带有“你点击了OK按钮”字样的对话框,如下所示:

说明:Button控件还会生成许多其他事件,例如MouseEnter,MouseDown和MouseUp事件。 如果打算为这些相关事件添加事件处理程序,请确保其作不会冲突。同时我们还可以设置Form窗体的AcceptButton或CancelButton为指定的按钮控件,它允许用户即使在按钮没有焦点时也可以通过按下 Enter 或 ESC 键来单击按钮。 

关于本系列的其他文章,可参考如下链接:

1. 基于.NET的Windows窗体编程之WinForms入门简介

2. 基于.NET的Windows窗体编程之WinForms控件简介

3. 基于.NET的Windows窗体编程之WinForms布局简介


以上就是《基于.NET的Windows窗体编程之WinForms事件简介》的全部内容,关于更多详细内容,可参考官方文档。希望能够一起学习,共同进步。

阅读原文:https://mp.weixin.qq.com/s/gk15KueZvCOAA4RogsKy1w


更多精彩文章浏览...
点击右上角图标分享到朋友圈
官方网站:http://www.clicksun.cn
咨询热线:400-186-1886
服务邮箱:service@clicksun.cn