第4章面向对象编程基础.ppt

上传人:可**** 文档编号:76388856 上传时间:2023-03-10 格式:PPT 页数:60 大小:1.88MB
返回 下载 相关 举报
第4章面向对象编程基础.ppt_第1页
第1页 / 共60页
第4章面向对象编程基础.ppt_第2页
第2页 / 共60页
点击查看更多>>
资源描述

《第4章面向对象编程基础.ppt》由会员分享,可在线阅读,更多相关《第4章面向对象编程基础.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第4章面向对象编程基础2Ch4Ch4面向对象面向对象编程基础编程基础4.1 类和对象类和对象4.2 方法方法4.3 属性和事件属性和事件4.4 WPF应用程序中的属性和事件应用程序中的属性和事件4.5 结结 构构4.6 常用类和结构的基本用法常用类和结构的基本用法4.1 4.1 类和对象类和对象4.1.1 类的定义和成员组织类的定义和成员组织4.1.2 访问修饰符访问修饰符4.1.3 字段和局部变量字段和局部变量4.1.4 构造函数构造函数4.1.5 析构函数和自动内存管理析构函数和自动内存管理4.1.6 new关键字和关键字和this关键字关键字4.1.7 static关键字关键字44.1.

2、1 4.1.1 类的定义和成员组织类的定义和成员组织1、自定义类自定义类定义定义对象具有的特征(字段、属性等)和可执行的操作(方法、事对象具有的特征(字段、属性等)和可执行的操作(方法、事件等)件等)。自定义自定义类的常用类的常用形式形式:访问修饰符访问修饰符 static class 类名类名:基类基类,接口序列,接口序列 类成员类成员2、类类的的成员成员包括包括:字段字段、属性、构造函数、方法、事件、运算符、索引器、析、属性、构造函数、方法、事件、运算符、索引器、析构函数等。构函数等。54.1.1 4.1.1 类的定义和成员组织类的定义和成员组织【例【例4-1】演示类的基本构造,运行效果如

3、图演示类的基本构造,运行效果如图4-1所示。所示。64.1.2 4.1.2 访问修饰符访问修饰符1、基本的访问修饰符、基本的访问修饰符 类类和类的成员都可以使用下面的访问修饰符。和类的成员都可以使用下面的访问修饰符。public:内部内部和外部代码都可以访问。和外部代码都可以访问。private :内部内部可访问可访问,外部,外部无法访问无法访问。类。类成员的访问成员的访问修饰符默认修饰符默认为为private。protected:类的内部类的内部或者从该类继承的子类可以访问。或者从该类继承的子类可以访问。internal:同一个程序集中的代码都可以访问,程序集外的其他代同一个程序集中的代码都

4、可以访问,程序集外的其他代码无法访问。类的访问修饰符默认为码无法访问。类的访问修饰符默认为internal。protected internal :从从该类继承的子类或者从另一个程序集该类继承的子类或者从另一个程序集中继中继承承的类都可以访问。的类都可以访问。72、partial修饰符修饰符:包含包含partial修饰符的类称为分部类修饰符的类称为分部类。可将可将同一个同一个类定义在类定义在多个文件中,编译器编译带有多个文件中,编译器编译带有partial修饰符修饰符的类时,会自动将这些文件合并在一起的类时,会自动将这些文件合并在一起。利用它可利用它可隔离隔离系统系统自动自动生成的代码生成的代

5、码和和程序员自己编写程序员自己编写的代码的代码。4.1.2 4.1.2 访问修饰符访问修饰符84.1.3 4.1.3 字段和局部变量字段和局部变量要点:要点:字段字段是类的成员,局部变量是块的成员。是类的成员,局部变量是块的成员。1字段字段字段是指在类或结构中声明的字段是指在类或结构中声明的“类级别类级别”的变量。或者说,字段是整个类的变量。或者说,字段是整个类内部的所有方法和事件中都可以访问的变量。内部的所有方法和事件中都可以访问的变量。2只读字段(只读字段(readonly)readonly关键字用于声明可以在程序运行期间只能初始化关键字用于声明可以在程序运行期间只能初始化“一次一次”的字

6、的字段。初始化的方法有两种,一种是在声明语句中初始化该字段,另一种是段。初始化的方法有两种,一种是在声明语句中初始化该字段,另一种是在构造函数中初始化该字段。在构造函数中初始化该字段。3局部变量局部变量局部变量是相对于字段来说的。可以将局部变量理解为局部变量是相对于字段来说的。可以将局部变量理解为“块块”级别的级别的变量变量。93.1.3 3.1.3 静态成员和实例成员静态成员和实例成员要点:(要点:(1)通过通过“类名类名.成员名成员名”调用调用类的类的静态成员静态成员。(2)通过)通过“实例名实例名.成员名成员名”调用调用类的类的实例实例成员。成员。1.static关键字关键字用用stat

7、ic声明的类或成员,声明的类或成员,表示加载表示加载到内存到内存中中的类的类或成员或成员只有只有一份,而一份,而不是不是加载类的加载类的实例实例。当垃圾回收器检测到不再使用该。当垃圾回收器检测到不再使用该静态静态类或静态类或静态成员成员时,会自动释放其占用的内存。时,会自动释放其占用的内存。static可用可用于类、字段、方法、属性、运算符、事件和构造函数,但不于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或者类以外的类型。能用于索引器、析构函数或者类以外的类型。用用static声明的声明的字段字段有两有两个个最最常见常见的用法:一的用法:一是是利用它利用它记录记录

8、已已实例化实例化的的对象对象的个数,二的个数,二是是利用它利用它存储存储需要需要在在所有实例之间共享的值。所有实例之间共享的值。用用static声明的声明的静态静态方法可以被重载但不能被重写,因为它们属于类,方法可以被重载但不能被重写,因为它们属于类,而不属于类的任何实例。而不属于类的任何实例。104.1.4 4.1.4 构造函数构造函数1.实例实例构造构造函数函数每每创建一个对象,都会先通过创建一个对象,都会先通过new关键字指明调用的构造函数,这种构造关键字指明调用的构造函数,这种构造函数称为实例构造函数。例如:函数称为实例构造函数。例如:Child child=new Child();或

9、者或者 var child=new Child();这这条语句的条语句的Child()就是被调用的实例构造函数。就是被调用的实例构造函数。114.1.4 4.1.4 构造函数和析构函数构造函数和析构函数2.默认构造默认构造函数和私有构造函数函数和私有构造函数(1)如果构造函数声明包含如果构造函数声明包含static修饰符,则为静态构造函数,否则为实例构造修饰符,则为静态构造函数,否则为实例构造函数。函数。(2)在)在创建创建第一个实例或引用任何静态成员之前,第一个实例或引用任何静态成员之前,CLR都都会会自动调用静态构造函自动调用静态构造函数。例如:数。例如:class SimpleClass

10、 static readonly long baseline;static SimpleClass()baseline=DateTime.Now.Ticks;124.1.4 4.1.4 构造函数构造函数静态静态构造构造函数函数的的特点特点:静态构造函数既没有访问修饰符,也没有参数。静态构造函数既没有访问修饰符,也没有参数。在创建第一个实例或引用任何静态成员之前,在创建第一个实例或引用任何静态成员之前,CLR会自动调用静态会自动调用静态构造函数来初始化类。换言之,静态构造函数是在实例构造函数之构造函数来初始化类。换言之,静态构造函数是在实例构造函数之前执行的。前执行的。程序员无法直接调用静态构造

11、函数,也无法控制何时执行静态构造程序员无法直接调用静态构造函数,也无法控制何时执行静态构造函数函数静态构造函数仅调用一次。如果静态构造函数引发异常,在程序运行所在静态构造函数仅调用一次。如果静态构造函数引发异常,在程序运行所在的应用程序域的生存期内,类型将一直保持未初始的应用程序域的生存期内,类型将一直保持未初始化的状态。化的状态。134.1.4 4.1.4 构造函数构造函数默认默认构造函数和私有构造构造函数和私有构造函数函数每个类要求必须每个类要求必须至少至少提供提供一一个构造函数。如果代码中个构造函数。如果代码中没有没有提供提供构构造造函数,则系统会自动为该类提供一个不带参数的空的构造函数

12、,函数,则系统会自动为该类提供一个不带参数的空的构造函数,这种自动提供的构造函数称为默认构造函数。这种自动提供的构造函数称为默认构造函数。构造函数构造函数一般用一般用public修饰符修饰符,但也可以用,但也可以用private创建私有构造创建私有构造函数。私有构造函数是一种特殊的构造函数,通常用在只包含静函数。私有构造函数是一种特殊的构造函数,通常用在只包含静态成员的类中态成员的类中,利用它可利用它可阻止阻止该类被实例化。该类被实例化。如果不指定构造函数的访问修饰符,默认是如果不指定构造函数的访问修饰符,默认是private。但是,一般。但是,一般都显式地使用都显式地使用private修饰符

13、来清楚地表明该类不能被实例化修饰符来清楚地表明该类不能被实例化。3重载构造重载构造函数函数构造函数可以被重载(构造函数可以被重载(Overloading),但不能被继承。),但不能被继承。144.1.5 4.1.5 析构函数和自动内存管理析构函数和自动内存管理析析构函数构函数析构函数是一种用于实现销毁类实例所需操作的成员。析构函数是一种用于实现销毁类实例所需操作的成员。析构函数不能带参数,也不能包含访问修饰符。析构函数不能带参数,也不能包含访问修饰符。析构函数析构函数是是系统系统自动自动调用的调用的,程序员程序员不能不能显式调用析构函数。显式调用析构函数。注意注意:程序员绝大多数情况下都不需要

14、自己去声明:程序员绝大多数情况下都不需要自己去声明析构析构函数,只有在某些函数,只有在某些特殊的高级应用中才需要这样做。特殊的高级应用中才需要这样做。自动自动内存管理内存管理由由C#使用垃圾回收器实现,即自动决定何时释放和销毁内存使用垃圾回收器实现,即自动决定何时释放和销毁内存。高级程序员也可以高级程序员也可以通过通过System.GC类提供的类提供的静态静态方法在一方法在一定程度上控制垃圾回收器的行为。该定程度上控制垃圾回收器的行为。该类用于类用于请求执行一次回收请求执行一次回收操作、并自动判断是否应该执行析构函数。操作、并自动判断是否应该执行析构函数。154.1.6 new4.1.6 ne

15、w关键字和关键字和thisthis关键字关键字1new关键字关键字在在C#语言中,语言中,new关键字有两个用途,一是用于创建对象,二是用于关键字有两个用途,一是用于创建对象,二是用于隐藏基类的成员隐藏基类的成员。(1)创建)创建对象对象定义定义一个类以后,就可以通过一个类以后,就可以通过new关键字创建该类的实例了。例如:关键字创建该类的实例了。例如:Person p1=new Person()Id=001,Name=张三张三;Person p2=new Person()Id=002,Name=李四李四;(2)对象初始化)对象初始化使用使用new关键字时,还可以用一条语句同时实现创建对象和初

16、始化属关键字时,还可以用一条语句同时实现创建对象和初始化属性,而无须显式调用构造函数,这种独特的构造形式称为对象初始化性,而无须显式调用构造函数,这种独特的构造形式称为对象初始化。(3)隐藏基类的成员)隐藏基类的成员 除了除了创建对象外,也可以在扩充类中通过创建对象外,也可以在扩充类中通过new关键字隐藏基类的成员。关键字隐藏基类的成员。164.1.6 new4.1.6 new关键字和关键字和thisthis关键字关键字2this关键字关键字在在C#语言中,语言中,this关键字有多个用途,其中最常见的用途是表示所访关键字有多个用途,其中最常见的用途是表示所访问的成员为当前对象。除此之外,在某

17、些特殊应用中,还可以利用问的成员为当前对象。除此之外,在某些特殊应用中,还可以利用this关关键字来串联构造函数、声明索引、扩展类型等键字来串联构造函数、声明索引、扩展类型等。(1)访问访问对象对象可通过可通过“this.实例名实例名”来访问当前对象,这是最基本也是最常见的用来访问当前对象,这是最基本也是最常见的用法。法。(2)串联构造函数)串联构造函数利用利用this关键字也可以串联执行构造函数,即可以在某个构造函数中关键字也可以串联执行构造函数,即可以在某个构造函数中调用另一个构造函数,并将本构造函数中的参数传递给另一个构造函数调用另一个构造函数,并将本构造函数中的参数传递给另一个构造函数

18、。(3)作为参数来传递)作为参数来传递利用利用this关键字,还可以将当前对象作为引用参数传递给另一个对象。关键字,还可以将当前对象作为引用参数传递给另一个对象。一般通过构造函数或者方法来实现参数的传递。介绍方法及其参数传递时,一般通过构造函数或者方法来实现参数的传递。介绍方法及其参数传递时,我们再学习其具体用法。我们再学习其具体用法。(4)其他(高级用法)其他(高级用法)174.1.6 new4.1.6 new关键字和关键字和thisthis关键字关键字【例【例4-2】演示演示this关键字的基本用法,运行结果如图关键字的基本用法,运行结果如图4-2所示。所示。184.1.7 static4

19、.1.7 static关键字关键字1基本概念基本概念如果如果有些成员是所有对象共用的,此时可将成员有些成员是所有对象共用的,此时可将成员定义为静态(定义为静态(static)的,当该类被装入内存时,系)的,当该类被装入内存时,系统就会专门开辟一部分区域保存这些静态成员统就会专门开辟一部分区域保存这些静态成员。static可用于类、字段、方法、属性、运算符、事可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或者类件和构造函数,但不能用于索引器、析构函数或者类以外的其他类型。以外的其他类型。194.1.7 static4.1.7 static关键字关键字2静态构造函数

20、静态构造函数如果如果构造函数声明包含构造函数声明包含static修饰符,则为静态构修饰符,则为静态构造函数,否则为实例构造函数造函数,否则为实例构造函数。创建。创建第第1个实例或引个实例或引用任何静态成员之前,用任何静态成员之前,CLR都会自动调用静态构造函都会自动调用静态构造函数数。class SimpleClass static readonly long baseline;static SimpleClass()baseline=DateTime.Now.Ticks;204.1.7 static4.1.7 static关键字关键字3静态类中的静态类中的static关键字关键字(1)声明声

21、明自定义类时如果加上自定义类时如果加上static关键字,则该类就是静态类关键字,则该类就是静态类。(2)静态静态类的主要类的主要特点:特点:u静态类静态类仅仅包含静态成员。包含静态成员。u静态类静态类无法无法被被实例化实例化。这与在非静态类中定义私有构造函数可阻止类被实。这与在非静态类中定义私有构造函数可阻止类被实例化的机制相似。例化的机制相似。u静态类静态类是是密封的,因此不能被继承。密封的,因此不能被继承。u静态类静态类不能不能包含实例构造函数,但可以包含静态构造函数。如果非静态类包含实例构造函数,但可以包含静态构造函数。如果非静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函

22、数包含需要进行重要的初始化的静态成员,也应定义静态构造函数。214.2 4.2 方法方法4.2.1 方法声明方法声明4.2.2 方法中的参数传递方法中的参数传递4.2.3 匿名方法与匿名方法与Lambda表达式表达式224.2.1 4.2.1 方法声明方法声明要点:要点:方法方法是类或结构的一种成员,是一组程序代码的集合,用于是类或结构的一种成员,是一组程序代码的集合,用于完成指定的功能。每个方法都有一个方法名,便于识别和让其他方完成指定的功能。每个方法都有一个方法名,便于识别和让其他方法调用法调用。定义方法的一般形式为定义方法的一般形式为访问修饰符访问修饰符 返回值类型返回值类型 方法名方法

23、名(参数序列参数序列)语句序列语句序列234.2.2 4.2.2 方法中的参数传递方法中的参数传递 方法方法声明中的参数用于向方法传递值或变量引用。方法的参数声明中的参数用于向方法传递值或变量引用。方法的参数从调用该方法时指定的实参获取实际值。有四类参数:从调用该方法时指定的实参获取实际值。有四类参数:值参数、引值参数、引用参数、输出参数和参数数组用参数、输出参数和参数数组。1值参数值参数值参值参数用于传递输入参数。一个值参数相当于一个局部变量,只数用于传递输入参数。一个值参数相当于一个局部变量,只是它的初始值来自为该形参传递的实参是它的初始值来自为该形参传递的实参。2引用参数(引用参数(re

24、f关键字)关键字)引用引用参数用于传递输入和输出参数。为引用参数传递的实参必须参数用于传递输入和输出参数。为引用参数传递的实参必须是变量,并且在方法执行期间,引用参数与实参变量表示同一存储位置是变量,并且在方法执行期间,引用参数与实参变量表示同一存储位置。引用引用参数使用参数使用ref修饰符声明修饰符声明。3输出参数(输出参数(out关键字)关键字)输出输出参数用于传递返回的参数,用参数用于传递返回的参数,用out关键字声明。格式为:关键字声明。格式为:out 参数类型参数类型 参数名参数名244.2.2 4.2.2 方法中的参数传递方法中的参数传递4数组参数(数组参数(params关键字关键

25、字)数组数组参数用于向方法传递可变数目的实参,用参数用于向方法传递可变数目的实参,用params关键字声明。关键字声明。例如,例如,System.Console 类的类的Write和和WriteLine方法使用的就是数组参方法使用的就是数组参数。它们的声明如下:数。它们的声明如下:public class Console public static void Write(string fmt,params object args).public static void WriteLine(string fmt,params object args).254.2.2 4.2.2 方法中的参数传递

26、方法中的参数传递5方法重载方法重载方法方法重载(重载(Overloading)是指具有相同的方法名,但)是指具有相同的方法名,但参数类型或参数个数不完全相同的多个方法可以同时出现参数类型或参数个数不完全相同的多个方法可以同时出现在一个类中的技术。这种技术非常有用,在项目开发过程在一个类中的技术。这种技术非常有用,在项目开发过程中,我们会发现很多方法都需要使用方法重载来实现。中,我们会发现很多方法都需要使用方法重载来实现。【例【例4-4】演示方法参数的基本用法,运行效果如图演示方法参数的基本用法,运行效果如图4-4所示。所示。264.2.3 4.2.3 匿名方法与匿名方法与LambdaLambd

27、a表达式表达式1基本语法基本语法Lambda表达式是一种特殊的表达式,特殊之处(也是创新之处)表达式是一种特殊的表达式,特殊之处(也是创新之处)在于它采用类似于在于它采用类似于“常规表达式常规表达式”的语法来描述函数或方法的声明和参的语法来描述函数或方法的声明和参数,而不需要显式声明函数或方法的名称。数,而不需要显式声明函数或方法的名称。Lambda表达式的基本语法格式如下:表达式的基本语法格式如下:(输入参数列表输入参数列表)=表达式或语句块表达式或语句块2基本用法基本用法根据输入参数的个数,有以下几种基本用法。根据输入参数的个数,有以下几种基本用法。(1)无输入参数)无输入参数此时需要用小

28、括号指定有零个输入参数(返回此时需要用小括号指定有零个输入参数(返回void类型)。例如:类型)。例如:()=SomeMethod()274.2.3 4.2.3 匿名方法与匿名方法与LambdaLambda表达式表达式(2)有一个输入参数)有一个输入参数如果仅有一个输入参数,左侧的小括号也可以省略。例如:如果仅有一个输入参数,左侧的小括号也可以省略。例如:x=x*x含义:输入参数是含义:输入参数是x,表达式返回的结果为,表达式返回的结果为x*x的值。的值。(3)有多个输入参数)有多个输入参数如果有多个输入参数,必须用小括号将这些输入参数括起来。例如:如果有多个输入参数,必须用小括号将这些输入参

29、数括起来。例如:(x,y)=x=y含义:输入参数是含义:输入参数是x和和y,如果,如果x等于等于y,返回的结果为,返回的结果为true,否则为,否则为false。(4)显式声明输入参数的类型)显式声明输入参数的类型当编译器无法推断输入参数的类型时,需要显式指定其类型。例如:当编译器无法推断输入参数的类型时,需要显式指定其类型。例如:(int x,string s)=s.Length x含义:输入参数是含义:输入参数是x和和s,返回的结果为,返回的结果为bool型。型。284.2.3 4.2.3 匿名方法与匿名方法与LambdaLambda表达式表达式【例【例4-5】演示演示Lambda表达式的

30、基本用法,表达式的基本用法,运行效果如图运行效果如图4-5所示。所示。294.3 4.3 属性属性和事件和事件4.3.1 属性属性声明声明4.3.2 委托委托4.3.3 事件事件304.3.1 4.3.1 属性声明属性声明1属性和字段的联系与区别属性和字段的联系与区别(1)字段占存储空间,属性不占存储空间。)字段占存储空间,属性不占存储空间。(2)属性只是对外公开字段,其功能类似于分别为)属性只是对外公开字段,其功能类似于分别为字段提供一个读方法和一个写方法。即通过字段提供一个读方法和一个写方法。即通过get访问访问器和器和set访问器指定读写字段的值时需要执行的语句。访问器指定读写字段的值时

31、需要执行的语句。根据使用情况不同,可以只提供根据使用情况不同,可以只提供get访问器或者只提访问器或者只提供供set访问器,也可以两者都提供。访问器,也可以两者都提供。314.3.1 4.3.1 属性声明属性声明2常规属性声明常规属性声明如果如果需要对外公开某些字段,并对字段的值进行需要对外公开某些字段,并对字段的值进行验证,可以利用属性的验证,可以利用属性的get和和set访问器来实现访问器来实现。class Student private int age;public int Age get return age;set if(value=0)age=value;324.3.1 4.3.1

32、 属性声明属性声明3自动实现的属性自动实现的属性自动自动实现的属性是指开发人员只需要声明属性,实现的属性是指开发人员只需要声明属性,而与该属性对应的字段则由系统自动提供而与该属性对应的字段则由系统自动提供。自动。自动实现实现的属性最初限制必须同时声明的属性最初限制必须同时声明get和和set访问器,但后访问器,但后来的来的C#版本取消了此限制。从版本取消了此限制。从VS 2017(C#6.0)开)开始,既可以同时声明始,既可以同时声明get和和set访问器,也可以仅声明访问器,也可以仅声明get访问器或者仅声明访问器或者仅声明set访问器。访问器。334.3.1 4.3.1 属性声明属性声明【

33、例【例4-6】演示属性的基本用法,运行效果如图演示属性的基本用法,运行效果如图4-6所示。所示。344.3.2 4.3.2 委托委托1定义定义委托委托委托委托(Delegate)类似于某人让另一方去做某件)类似于某人让另一方去做某件事事定义委托的一般语法为:定义委托的一般语法为:访问修饰符访问修饰符 delegate 返回类型返回类型 委托名委托名(参数序列参数序列);例如:例如:public delegate double MyDelegate(double x);。354.3.2 4.3.2 委托委托2通过委托调用方法通过委托调用方法定义定义了委托类型后,就可以像创建类的实例那样了委托类型

34、后,就可以像创建类的实例那样来创建委托的实例。委托实例封装了一个调用列表,来创建委托的实例。委托实例封装了一个调用列表,该列表包含一个或多个方法,每个方法都是一个可调该列表包含一个或多个方法,每个方法都是一个可调用的实体用的实体。3使用匿名方法创建委托使用匿名方法创建委托可以可以使用匿名方法创建委托,这是即时创建的使用匿名方法创建委托,这是即时创建的“内联方法内联方法”。由于匿名方法可以查看外层方法的。由于匿名方法可以查看外层方法的局部局部变量变量。364.3.2 4.3.2 委托委托【例【例4-7】演示委托的基本用法,运行效果如图演示委托的基本用法,运行效果如图4-7所示。所示。374.3.

35、3 4.3.3 事件事件1事件的声明和事件的声明和引发引发事件事件(Event)是一种使类或对象能够提供通知的)是一种使类或对象能够提供通知的成员,一般利用事件响应用户的鼠标或键盘操作,或成员,一般利用事件响应用户的鼠标或键盘操作,或者自动执行某个与事件关联的行为。要在应用程序中者自动执行某个与事件关联的行为。要在应用程序中自定义和引发事件,必须提供一个事件处理程序,以自定义和引发事件,必须提供一个事件处理程序,以便让与事件相关联的委托能自动调用它便让与事件相关联的委托能自动调用它。public delegate void MyEventHandler();public event MyEve

36、ntHandler Handler;public void OnHandler()Handler();myEvent.Handler+=new MyEventHandler(myEvent.MyMethod);myEvent.Handler=new MyEventHandler(myEvent.MyMethod);384.3.3 4.3.3 事件事件2具有标准签名的事件具有标准签名的事件在在实际的应用开发中,绝大部分情况下使用的都实际的应用开发中,绝大部分情况下使用的都是具有标准签名的事件。在具有标准签名的事件中,是具有标准签名的事件。在具有标准签名的事件中,事件处理程序包含两个参数,第事件处

37、理程序包含两个参数,第1个参数是个参数是Object类类型,表示引发事件的对象;第型,表示引发事件的对象;第2个参数是从个参数是从EventArgs类型派生的类型,用于保存事件数据类型派生的类型,用于保存事件数据。【例【例4-8】演示事件的基本用法,运行效果如图演示事件的基本用法,运行效果如图4-8所所示。示。394.4 WPF4.4 WPF应用程序中的属性和事件应用程序中的属性和事件4.4.1 WPF中的控件中的控件属性属性4.4.2 事件注册与处理事件注册与处理4.4.3 WPF事件路由策略事件路由策略4.4.4 鼠标事件鼠标事件4.4.5 键盘事件键盘事件4.4.6 手写笔和触控事件手写

38、笔和触控事件404.4.1 WPF4.4.1 WPF中的控件属性中的控件属性1CLR属性属性在在C#中,属性(中,属性(Property)是类对外公开的字段,)是类对外公开的字段,用用get和和set访问器实现,这些属性实际上是公共语言访问器实现,这些属性实际上是公共语言运行时属性,简称运行时属性,简称CLR属性属性。2依赖项属性依赖项属性在在WPF应用程序中,为了用应用程序中,为了用XAML描述动态变化描述动态变化的属性值以及用的属性值以及用XAML实现数据绑定,除了实现数据绑定,除了CLR属性属性之外,每个控件又用之外,每个控件又用DependencyProperty类对类对CLR属性做了

39、进一步的封装和扩展,这些与属性做了进一步的封装和扩展,这些与CLR属性对应属性对应的封装和扩展后的属性称为依赖项属性。的封装和扩展后的属性称为依赖项属性。414.4.1 WPF4.4.1 WPF中的控件属性中的控件属性3附加属性附加属性除了依赖项属性之外,在除了依赖项属性之外,在XAML中还有一个功能,该中还有一个功能,该功能可以让开发人员在某个子元素上指定其父元素的功能可以让开发人员在某个子元素上指定其父元素的属性,以这种方式声明的属性称为附加属性。属性,以这种方式声明的属性称为附加属性。定义附加属性的一般形式为:定义附加属性的一般形式为:父元素类型名父元素类型名.属性属性名名 Hello4

40、24.4.2 4.4.2 事件注册与处理事件注册与处理1、在、在XAML中注册事件中注册事件 在在XAML中,声明事件的一般形式中,声明事件的一般形式为事件名事件名=事件处理程序名事件处理程序名或者:或者:子元素类型名子元素类型名.事件名事件名=事件处理程序名事件处理程序名 一般通一般通过事件列表附加事件。例如:事件列表附加事件。例如:434.4.2 4.4.2 事件注册与处理事件注册与处理2、在、在C#代代码中注册事件中注册事件 利用利用+=注册事件,利用注册事件,利用-=取消注册取消注册 ,例如:,例如:public MainWindow()InitializeComponent();Bu

41、tton1.MouseDoubleClick+=Button1_MouseDoubleClick;void Button1_MouseDoubleClick(object sender,MouseButtonEventArgs e)/事件处理代码事件处理代码 444.4.2 4.4.2 事件注册与处理事件注册与处理3、事件、事件处理程序中的参数理程序中的参数 所有所有WPF事件事件处理程序默理程序默认都提供两个参数。例如:都提供两个参数。例如:private void OkButton_Click(object sender,RoutedEventArgs e)参数参数sender包括附加包括

42、附加该事件的事件的对象,参数象,参数e是数据源的相关数据。是数据源的相关数据。4、事件使用要点、事件使用要点 (1)在)在WPF中中,绝大部分情况下都是用大部分情况下都是用e.Source来判断事件源是来判断事件源是谁。(2)大部分情况下通)大部分情况下通过【属性属性】窗口直接窗口直接设置某元素的事件置某元素的事件 (3)如果具有相同)如果具有相同类型的元素很多,而且型的元素很多,而且这些元素都会引些元素都会引发某个相同某个相同 的事件,此的事件,此时可以在其父元素中声明附加事件(可可以在其父元素中声明附加事件(可简化事件声明化事件声明 的次数)。的次数)。454.4.3 WPF4.4.3 W

43、PF事件路由策略事件路由策略分直接、冒泡和隧道三种方式。分直接、冒泡和隧道三种方式。(1)直接路由)直接路由 直接(直接(Direct)是指)是指该事件只事件只针对元素自身,而不会再去路由到其他元素。元素自身,而不会再去路由到其他元素。(2)冒泡)冒泡 冒冒泡泡(Bubble)是是指指从从事事件件源源依依次次向向父父元元素素方方向向查找找,直直到到查找找到到根根元元素素为止止。目目的的是是搜搜索父元素中是否包含索父元素中是否包含针对该元素的附件事件声明。元素的附件事件声明。利用利用“冒泡冒泡”可在某个父元素上一次性地可在某个父元素上一次性地为多个子元素注册同一个事件:多个子元素注册同一个事件:

44、464.4.3 WPF4.4.3 WPF事件路由策略事件路由策略(3)隧道路由)隧道路由隧道(隧道(Tunnel)是指从根元素开始向子元素依次路由,直到)是指从根元素开始向子元素依次路由,直到查找到事件源找到事件源为止。它止。它与冒泡路由与冒泡路由刚好是相反的好是相反的过程。例如:程。例如:474.4.4 4.4.4 鼠标事件鼠标事件在在System.Windows.Input命名空间下,命名空间下,WPF为鼠标输入提供为鼠标输入提供了一个专门的了一个专门的Mouse类,用于附加鼠标事件类,用于附加鼠标事件。【例【例4-9】演示鼠标事件的基本用法,运行效果如演示鼠标事件的基本用法,运行效果如图

45、图4-9所示。所示。484.4.5 4.4.5 键盘事件键盘事件要使某个控件接受要使某个控件接受键盘事件,必事件,必须将将该控件的控件的Focusable属性属性设置置为true 传递的事件名功能描述KeyDown当按下键盘时产生KeyUp当释放键盘时产生GotKeyboardFocus当元素获得输入焦点时产生LostKeyboardFocus当元素失去输入焦点时产生494.4.6 4.4.6 手写笔和触控事件手写笔和触控事件在在WPF应用程序中,可以同用程序中,可以同时接收接收来自多个触控的来自多个触控的输入,并在入,并在发生触控生触控时(如食指双(如食指双击、手、手势移移动、拇指和食指、拇

46、指和食指分开放大、拇指和食指并分开放大、拇指和食指并拢缩小等)引小等)引发相相应的事件。的事件。504.5 4.5 结结 构构结构结构是值类型,它和类的主要区别是结构中的数据保存在堆栈是值类型,它和类的主要区别是结构中的数据保存在堆栈(Stack)中而不是保存在堆()中而不是保存在堆(Heap)中。另外,所有结构都隐式地)中。另外,所有结构都隐式地从从Object继承,但自定义结构时,不能从其他结构继承继承,但自定义结构时,不能从其他结构继承。结构成员和类成员相同,包括字段、结构成员和类成员相同,包括字段、属性属性、构造函数构造函数、方法、事件、方法、事件、运算符、索引器、析构函数等运算符、索

47、引器、析构函数等。从形式上看,结构的构造与类的构造非常相似,区从形式上看,结构的构造与类的构造非常相似,区别仅是前者用别仅是前者用struct关键字,后者用关键字,后者用class关键字。关键字。除此之外,成员的声明都是相同的。除此之外,成员的声明都是相同的。自定义结构的常用形式为:自定义结构的常用形式为:访问修饰符访问修饰符 static struct 结构名结构名:接口序列接口序列 结构成员结构成员514.5 4.5 结结 构构【例【例4-10】分别用类和结构定义具有分别用类和结构定义具有x、y坐标的点,坐标的点,然后在主程序中各创建并初始化一个含有然后在主程序中各创建并初始化一个含有3个

48、点的个点的数组。运行效果如图数组。运行效果如图4-10所示。所示。524.6 4.6 常用结构和类的用法常用结构和类的用法4.6.1 数学运算类数学运算类4.6.2 日期时间处理结构日期时间处理结构4.6.3 计时计时器类器类4.6.4 秒表秒表类类4.6.5 随机数类随机数类534.6.1 4.6.1 数学运算类数学运算类Math类定义了各种常用的数学运算,该类位于类定义了各种常用的数学运算,该类位于System命名空间下,其作命名空间下,其作用有两个,一个是为三角函数、对数函数和其他通用数学函数提供常数,用有两个,一个是为三角函数、对数函数和其他通用数学函数提供常数,如如PI值等;二是通过

49、静态方法提供了各种数学运算功能值等;二是通过静态方法提供了各种数学运算功能。【例【例4-11】演示数学运算类的基本用法,运行效果如图演示数学运算类的基本用法,运行效果如图4-11所所示。示。544.6.2 4.6.2 日期时间处理结构日期时间处理结构用于用于对对日期和日期和时间时间进行进行处理。处理。DateTime表示范围在表示范围在0001年年1月月1日午夜日午夜12:00:00到到9999年年12月月31日晚上日晚上11:59:59之间的日期和时间,最小时间单位等于之间的日期和时间,最小时间单位等于100ns。TimeSpan表示一个时间间隔,其范围在表示一个时间间隔,其范围在Int63

50、.MinValue到到Int63.MaxValue之间。之间。【例【例4-12】演示演示DateTime结构和结构和TimeSpan结构的基本用法,结果如图结构的基本用法,结果如图4-12所示。所示。554.6.3 4.6.3 计时器类计时器类DispatcherTimer类全称为类全称为System.Windows.Threading.DispatcherTimer类,是一个基于类,是一个基于WPF的计时组件,利用它可在的计时组件,利用它可在WPF客户端应用程序中按固定间客户端应用程序中按固定间隔周期性地引发隔周期性地引发Tick事件,然后通过处理这个事件来提供定时处事件,然后通过处理这个事

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 工作计划

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁