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》笔记三的更多相关文章

  1. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  2. JavaScript高级程序设计学习(三)之变量、作用域和内存问题

    这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...

  3. javascript高级程序设计--笔记01

    概述 JavaScript的实现包含三个部分: 1  核心(ECMAScript)   提供核心语言功能 2  文档对象模型(DOM)  一套提供了访问以及操作网页内容的API 3  浏览器对象模型( ...

  4. JavaScript高级程序设计第三版学习笔记(一)之数据类型区分详谈

    null.NaN.undefined三者的区别是什么? 在初次接触到JavaScript的时候,傻傻的分不清null.NaN.undefined三者到底区别何在,在实际的项目开发中也因为这个问题而困惑 ...

  5. JavaScript高级程序设计第三版-读书笔记(1-3章)

    这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript   提供核心语言功能 DOM     提供访问 ...

  6. javascript高级程序设计第三章的一些笔记

    [TOC] 1. 语法 1.1 区分大小写 变量.函数名和操作费都区分大小写. 1.2 标识符 标识符指变量.函数.属性的名字,或者函数的参数.标识符按以下规则组合: 第一个字符必须是一个字母,下划线 ...

  7. Javascript高级程序设计第三版-笔记

    1.JS数值最大值最小值: >Number.MIN_VALUE <5e-324 >Number.MAX_VALUE <1.7976931348623157e+308 判断数值是 ...

  8. javascript高级程序设计第三版书摘

    在HTML 中使用JavaScript <script>元素 在使用<script>元素嵌入 JavaScript 代码时,只须为<script>指定 type 属 ...

  9. 22.1 高级函数【JavaScript高级程序设计第三版】

    函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...

  10. 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域

    上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...

随机推荐

  1. hdu 2042 - 不容易系列之二

    题意:(略)太长了 解法:找规律,发现A[i]=A[i-1]*2-2; 1: #include<stdlib.h> 2: #include<string.h> 3: #incl ...

  2. 阿里巴巴集团2016校园招聘-Python工程师笔试题(附加题+部分答案)

    前言 第一次网上笔试,被虐的很惨.一是不太习惯,最主要的是还是自己对Python的掌握,还不够熟练.下面是这次阿里笔试相关信息 笔试时间是,2015年8月23日,10:00——12:00 对于笔试题, ...

  3. spring-boot-cli

  4. Python2.7安装(win7)

    Python可在官方网站直接下,或者百度一下Python2.7下载,这里推荐使用2.7而不是3.3,比较适合初学者 工具/原料 win7系统 python2.7安装包 方法/步骤 1.从官网下载最新的 ...

  5. JavaWeb文件下载,提示用户保存而不是让浏览器直接打开

    1.通过HttpServletResponse对象实现文件下载 服务端向客户端游览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt.jpg等,会直接在浏览器中显示,如果需 ...

  6. mono中显示debug信息(filename/lineno)

    一直发现 mono 的 traceback 没有 fliename.lineno,很奇怪.研究了下,原来编译和运行时要加参数的. dmcs -debug /r:xunit.dll /t:library ...

  7. Autofac.Integration.Mvc分析

    Autofac.Integration.Mvc static ILifetimeScope LifetimeScope { get { return (ILifetimeScope)HttpConte ...

  8. Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持   ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...

  9. Yii2 打印sql语句和批量插入数据

    打印sql语句: $model->find()->createCommand()->getRawSql(); 批量插入 Yii::$app->db->createComm ...

  10. [MongoDB]增删改查

    摘要 上篇文章学习了mongodb在windows上的安装,以及如何开启mongodb,最后列举了简单的增删改查操作.本篇将继续深入学习一下增删改查. 相关文章 [MongoDB]入门操作 CRUD ...