《深入浅出WPF》笔记三
1、Field:字段,封装在类中的变量。
Method:方法,封装在类中的函数。
成员:类中的字段和方法,可分为静态成员和非静态成员。
静态字段在内存中只有一份拷贝。
非静态字段是每个实例拥有一个拷贝。
方法无论是否静态,在内存中都只有一份拷贝。
2、CLR属性
直接把字段的数据暴露给外界的作法很不安全,我们希望对象自己有能力判断将要写入的字段值是否正确。于是提供了Set和Get方法来对private的字段进行读取,这就是private字段的安全包装。.Net Framework将Get/Set方法合并成了属性(Property),也称为CLR属性。
属性的编译结果实际上是两个方法(Get/Set),在内存中只有一份拷贝,不会增加内存负担。
3、依赖属性
一种可以自己没有值,并能通过Binding从数据源获得值得属性。
4、依赖对象(Dependency Object)
对象在被创建时并不包含用于存储数据的空间,只保留在需要用到数据时能够获得默认值、借用其他对象数据、或实时分配空间的能力,这种能力依靠依赖属性(Dependency Property)来实现。
WPF中所有UI控件都是依赖对象。
5、依赖属性的包装器(wrapper)是一个CLR属性。包装器以“实例属性”的形式向外界暴露依赖属性,这样一个依赖 属性才能成为数据源的Path。
6、自定义一个依赖对象并声明一个依赖属性。
public class Student:DependencyObject
{
public Student()
{ } public static readonly DependencyProperty NameProperty=
DependencyProperty.Register("Name",typeof(string),typeof(Student));
}
7、直接使用上面的依赖属性。通过依赖对象的GetValue和SetValue方法对依赖属性的值进行读写。
Student stu=new Student();
stu.SetValue(Student.NameProperty,this.textBox1.Text);
this.textBox2.Text=(string)stu.GetValue(Student.NameProperty);
8、直接使用GetValue和SetValue方法略不方便,因此大多数情况下我们会为依赖属性添加一个CLR属性外包装。有了这个包装,依赖对象就有了用于暴露数据的Binding Path。
public string Name
{
get{return (string)GetValue(NameProperty);}
set{SetValue(NameProperty,value);}
}
依赖属性自带NorifyPropertyChanged的功能。
9、声明依赖属性的snippet:输入propdp,连续按两次Tab键,就出现了标准依赖属性的代码段。
10、依赖属性的创建和注册过程:
创建一个依赖DependencyProperty实例,用它的CLR属性名和宿主类型名生成HashCode,最后把HashCode和DependencyProperty实例作为Key-Value对存到全局的名为PropertyFromName的HashCode中。最后,生成的DependencyProperty实例作为返回值返回。
每个DependencyProperty实例都有一个唯一的GlobalIndex的int类型属性,这个值才是DependencyProperty实例的哈希值,通过这个值可以直接检索到该实例。
11、依赖属性如何存储值
每个DependencyObject实例都自带一个EffectiveValueEntry类型数组,而每个EffectiveValueEntry的PropertyIndex属性的值就是DependencyProperty实例的GlobalIndex。
当某个依赖属性的值要被读取时,算法会从EffectiveValueEntry[]数组中检索值,如果没有值,就会返回依赖属性的默认值。
被static readonly关键字修饰的依赖属性对象的作用是用来检索真正的属性值而不是存储值。
12、附加属性
snippet:propa
声明一个附加属性:
class School:DependencyObject
{ public static int GetGrade(DependencyObject obj)
{
return (int)obj.GetValue(GradeProperty);
} public static void SetGrade(DependencyObject obj, int value)
{
obj.SetValue(GradeProperty, value);
} // Using a DependencyProperty as the backing store for Grade. This enables animation, styling, binding, etc...
public static readonly DependencyProperty GradeProperty =
DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(ownerclass), new PropertyMetadata()); }
使用附加属性:
Student stu = new Student();
School.SetGrade(stu, );
int grade = School.GetGrade(stu);
附加属性的本质是依赖属性,也可以使用Binding依赖在其他对象的数据上。
13、路由事件(RoutedEvent)
与依赖属性类似,每个路由事件都有一个自己的CLR事件。
监听和处理路由事件的方法:
C#:
this.grid.AddHandler(Button.ClickEvent,new RoutedEventHandler(this.ButtonClicked));
XAML:
<Grid x:Name="gridRoot" Button.Click="ButtonClicked">
</Grid>
14、RoutedEventArgs的两个属性
Source:LogicalTree上的消息源头
OriginalSource:VisualTree上的消息源头
15、附加事件
附加事件的宿主没有可视化实体的界面元素。比如,设计一个Student类,当Student实例的属性值发生变化时就激发一个路由事件。为了发送路由事件,可以借用Button等UI元素的RaiseEvent()方法。
定义附加事件:
class Student
{
public static readonly RoutedEvent NameChangedEvent = EventManager.RegisterRoutedEvent
("NameChanged",RoutingStrategy.Bubble,typeof(RoutedEventHandler),typeof(Student)); public static void AddNameChangedHandler(DependencyObject d, RoutedEventHandler h)
{
UIElement e = d as UIElement;
if (e != null)
{
e.AddHandler(Student.NameChangedEvent, h);
}
} public static void RemoveNameChangedHandler(DependencyObject d, RoutedEventHandler h)
{
UIElement e = d as UIElement;
if (e != null)
{
e.RemoveHandler(Student.NameChangedEvent, h);
}
}
public int Id { get; set; }
public string Name { get; set; }
}
16、附加事件的路由第一站是激发它的元素(如上例中的button)
17、实际上,附加事件一般都是定义在像Binding、Mouse、KeyBoard等全局的Helper类中。
18、路由命令(RoutedCommand)
使用命令可以避免自己写代码去判断Button是否可用以及添加快捷键。
命令目标发送路由事件CanExecute和Executed等,这些路由事件沿着UI元素树向上传递并被CommandBinding捕捉。
《深入浅出WPF》笔记三的更多相关文章
- JavaScript高级程序设计第三版.CHM【带实例】
从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- javascript高级程序设计--笔记01
概述 JavaScript的实现包含三个部分: 1 核心(ECMAScript) 提供核心语言功能 2 文档对象模型(DOM) 一套提供了访问以及操作网页内容的API 3 浏览器对象模型( ...
- JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈
null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...
- JavaScript高级程序设计第三版-读书笔记(1-3章)
这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript 提供核心语言功能 DOM 提供访问 ...
- javascript高级程序设计第三章的一些笔记
[TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...
- Javascript高级程序设计第三版-笔记
1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...
- javascript高级程序设计第三版书摘
在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...
- 22.1 高级函数【JavaScript高级程序设计第三版】
函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...
- 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域
上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...
随机推荐
- ASP.NET MVC 给ViewBag赋值Html格式字符串的显示问题总结
今天再给自己总结一下,关于ViewBag赋值Html格式值,但是在web页显示不正常; 例如,ViewBag.Content = "<p>你好,我现在测试一个东西.</p& ...
- django 提示ImportError: cannot import name json_response
from json_response import JsonResponse, json_response as json_resp 使用的语句如上,其实并不是没有安装,只是需要升级一下 pip in ...
- iOS评分(给个好评)
id 721996244 可以测试 NSString *str = [NSString stringWithFormat:@"itms-apps://itunes.apple.com/app ...
- Hough Transform
Hough Transform Introduction: The Hough transform is an algorithm that will take a collection of poi ...
- 基于UDP协议的程序设计
使用UdpClient类进行编程 UdpClient类的使用方法 第一阶段 创建UdpClient实例 UdpClient udpClient = new UdpClient(); IPAddress ...
- HD1556Color the ball(树状数组)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 【原】使用webpack打包的后,公共请求路径的配置问题
在我们公司,和后台接接口时,公共的请求路径我们是单独抽出来的,放在一个独立的public.js中,在public.js中存入那个公共变量 公共变量是这样 在其他地方使用ajax时,我们就这样使用 这种 ...
- VMWare12虚拟CentOS7共享文件的过程
环境: 宿主机:Win10企业版,虚拟机:VMware pro12.5,虚拟OS:CentOS7.0 过程: VMware菜单:虚拟机->设置->选项,选中宿主机要共享的磁盘或目录,点击确 ...
- HTML学习笔记——图片显示、图片跳转、图片相对路径
1>显示图片.用a标签实现点击图片跳转.地图标签/点击图片上固定区域跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...
- 给IOS系统的微信页面赋Title
给页面赋一个title是最平常不过的事情了,不过在IOS下动态给页面赋title可不是平常的事情. 看代码: function setIOStitle(title) { $body = $('body ...