wpf是什么(微软WPF是什么)

[了解属性和字段]
我们知道 , 属性是面向对象语言中用来封装字段的外衣 。它们就像是田野和外界之间的桥梁 。我们可以通过属性来验证数据的合法性或者控制外部可访问性 , 等等 。每个属性后面都有相应的字段 。即使是自动属性 , 系统也会在编译时创建它的字段 , 但自动属性是微软给我们的语法糖果 。在C#中 , 属性最终被编译成两个 :get_ attribute name 和set_ attribute name (如果属性是只读的 , 则没有set  , 否则没有get ) 。
编译成  , 属性不会占用太多空间空 , 因为 存在于内存的公共 区 , 每个实例的创建只是多了一个指向 的指针 。但是 , 字段不同 。当创建每个实例时 , 将在内存中打开一个相应的空空间来存储这些字段 。一个类中的字段越多 , 它在内存中占用的空空间就越大 。理解了这个理论 , 我们来正式解释一下什么是依赖属性 , 为什么会有依赖属性 。
[什么是依赖属性]
当我们使用一个控件的时候 , 我们可以看到控件有很多属性 , 如果有属性 , 就有字段的内存开销 。但是 , 其实对于一个控件 , 我们大多数人只是使用了它的一些常用属性 , 比如Button , 我们使用最频繁的 , 比如Content , Height等属性 , 那些不常用的属性就相当于白白占用内存 。当我们编写一个复杂的XAML页面 , 其中涉及到许多控件的使用 , 这种浪费内存的现象是非常严重的 。
对此 , 微软在WPF引入了 Dependency Property , 允许你在没有自己字段的情况下 , 通过绑定的方式绑定到其他对象的属性或数据源 , 从而获得值 。这种对其他对象的依赖属性就是依赖属性 。当它的功能明确之后 , 我想大家就不会对依赖这个词产生怀疑了 。从属属性没有自己的字段 。它们只是在使用的时候通过绑定从其他对象中获取 , 为自己临时创建一个内存空空间 , 这样在不使用的时候就不会有额外的内存消耗 。
包含依赖属性的对象称为 DependencyObject  , 需要继承DependencyObject的基类 。其实WPF所有的控件都继承了Dependency Object的类 , 控件中的属性大部分都是依赖属性 , 这样我们就可以通过绑定来解除值的绑定(不熟悉绑定的同学可以参考前面的Binding (1): data)
[从代码中学习依赖属性]
让我们学习如何通过代码声明和使用依赖属性 。请先阅读我写的一段代码:
public class Pikachu : DependencyObject{ public static readonly DependencyProperty PikachuNameProperty =DependencyProperty.Register("PikachuName",typeof(string),typeof(Pikachu));}如上所述 , 要使用依赖属性 , 必须继承DependencyObject类 。此外 , 声明
依赖属性需要用public static readonly的三个修饰符来修饰 , 实例依赖属性不是由new运算符获得 , 而是由DependencyProperty的Register 获得 。
依赖对象的名字有一个约定 , 就是Property是后缀 。C#中有很多命名约定 , 比如I作为接口的前缀 , Attribute作为特性的后缀等等 。 , 所有这些都是为了一个好的结果 。
Register 有三个重载 。这里 , 我们使用它的三个参数的重载 , 它也有四个参数和五个参数的重载 。
之一参数是指定依赖属性的包装器名称是什么(包装器就是用来包装依赖属性的 , 通过一个属性来包装依赖属性供外部使用 , 具体下文会讲 , 此处先做了解) 第二个参数是指定依赖属性要存储的值的类型是什么 第三个参数是指定依赖属性属于哪个类的 , 或者说是为哪个类定义依赖属性 其它重载中第四个参数是指定依赖属性的源数据 , 用于提供给调用者此依赖属性的信息 其它重载中第五个参数是自定义的依赖属性生成时的验证回调依赖属性已声明 , 但如何为依赖属性赋值需要DependencyObject基类中的 。我们使用SetValue 和GetValue[/s2/] 来操作依赖属性的值 。请查看下面修改后的代码:
public class Pikachu : DependencyObject{ public string PikachuName { get =【wpf是什么(微软WPF是什么)】