[转]WPF 依赖项属性
from:http://blog.csdn.net/datoumimi/article/details/8033682
ps:环境限制,发的东西一长就会被拦截,所以删了一部分
UI软件中经常会用到大量的控件,而每一个控件都是一个对象,每一个类都会有大量的属性,如果没创建一个对象就将所有的属性都创建出来,无非会占用大量的内存,wpf使用依赖项属性来提升了性能。
查看任何一个控件的定义,以button为例,都会发现类内包含大量的依赖性属性定义,注意到其中DependencyProperty都是static readonly的,而每一个依赖项属性都会有一个去掉“Property”的CLR属性和他对应,而我们在xaml中访问的都是CLR属性。
public static readonly DependencyProperty IsCancelProperty;
public bool IsCancel { get; set; }
如果我们自定义一个依赖项属性,方法是这样的
public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(ProvienceInfo));
public string Name
{
set
{
{
SetValue(NameProperty, value);
}
}
get
{
return GetValue(NameProperty).ToString();
}
}
注意到使用DependencyProperty的静态方法register将该属性注册到DependencyProperty上,DependencyProperty类的内部包含一个hashtable,所
有的依赖项属性都存在这个哈希表中,哈希表的key为由DependencyProperty的name和ownertype组成的类,且使用name+ownertype作为的哈希值,这
样就可以确保每个key是不重复的
private class FromNameKey{
privatestring _name;
private Type_ownerType;
// Methods
public FromNameKey(string name, Type ownerType)
{
this._name = name;
this._ownerType = ownerType;
this._hashCode =
this._name.GetHashCode() ^
this._ownerType.GetHashCode();
}
依赖项属性到底是怎么样节约内存的呢,由于我们创建控件对象时只会设置很少一部分属性,大部分属性都是使用默认值,默认值也就是所有的对象都是一样的,那就可以使用静态属性来表示了,上面提到的存储依赖项属性的hashtable就发挥作用了,clr将所有没有设置的属性存放在这个hashtable中,对于设置了值的属性,则会为这个对象创建一个数组,类型为EffectiveValueEntry,包含了一个属性的index,dependencyproperty提供了一个方法getglobalindex来获取此属性在hashtable中的位置,value当然就可以在此取出。
internal struct EffectiveValueEntry
{
internal int PropertyIndex { get; set; }
internal object Value { get; set; }
}
这也是为什么依赖项属性注册为static readonly的却可以修改的原因。
依赖项属性还给我们提供了什么其他好处
数据绑定:当我们绑定到数据源时,如果数据源的变更要想通知到UI,就需要实现inotifypropertychange接口,但如果将绑定源声明为依赖项属性,则可以直接通知更新UI。
本地值:动画改变的属性只是改变临时变量,并未改变属性值
附加属性和附加事件:
附加属性是全局的依赖属性,依赖属性属于某个类,而附加属性可以用在其他对象上
[转]WPF 依赖项属性的更多相关文章
- 浅谈WPF依赖项属性
浅谈WPF依赖项属性 0. 引言 依赖项属性虽然在使用上和CLR属性一样,但是它是WPF特有的,不同于CLR属性.只是封装为我们常用CLR的属性,在语法使用上和CLR属性一样.WPF中一些功能:动画, ...
- WPF依赖项属性不需要包装属性也可以工作
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- 学习WPF——初识依赖项属性
入门 首先创建一个依赖项属性 然后绑定父容器的DataContext到这个依赖项的实例 接着绑定子元素的属性到依赖项属性(注意Button的Content属性) 程序最终的运行结果: 说明 首先是 ...
- WPF学习系列之二 (依赖项属性)
依赖属性;(dependency property) 它是专门针对WPF创建的,但是WPF库中的依赖项属性都使用普通的.NET属性过程进行了包装.从而可能通过常规的方式使用它们,即使使用他们的代码不 ...
- WPF中的依赖项属性
Form cnblogs 桂素伟 随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越多. 只能跟着MSDN来学了,所以想是在这里记录下学习的过程和对知识的理解. 先从最基本的吧,依赖项属性 ...
- 迟到的 WPF 学习 —— 依赖项属性
本章学习依赖项属性,英文原文 Dependency Property,它是传统 .Net Framework 属性的扩展,是 WPF 的专属,但所幸使用起来和传统属性几乎一样.WPF 元素所提供的大多 ...
- WPF中的依赖项属性(转)
出处:https://www.cnblogs.com/axzxs2001/archive/2010/04/25/1719857.html 随着WPF的推广,不得不重新拾起WPF来,因为这块的产品越来越 ...
- WPF的依赖项属性
WPF的依赖项属性 属性与事件是.NET抽象模型的核心部分.WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制,还添加了附加 ...
- 在 WPF 中获取一个依赖对象的所有依赖项属性
原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...
随机推荐
- C语言中的命名空间
C语言中的命名空间 命名空间是为了解决 "在相同作用域内如何区分 相同的标识符". 说明: ①只有在相同作用域的情况下才能使用到命名空间去区分标识符,在嵌套的作用域.不同的作用域区 ...
- (ASP.NET)总结MVC中@Html表单用法
1.当type类型是text时:@Html.TextBoxFor(model => Model.Name,new{@style = "width: 50px;", @clas ...
- jQuery选择器之可见性过滤选择器Demo
测试代码 05-可见性过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...
- codeforces 677C C. Vanya and Label(组合数学+快速幂)
题目链接: C. Vanya and Label time limit per test 1 second memory limit per test 256 megabytes input stan ...
- 根据ui控件的字体计算占用的长度
//1.根据icon计算name的长度 CGFloat nameX = CGRectGetMaxX(_icon.frame) + kBorder; CGFloat nameY = iconY; //计 ...
- Differential Geometry之第一章欧式空间
书籍:<微分几何>彭家贵 局部微分几何 第一章.欧式空间 1.1向量空间 (1)向量空间 a.向量空间是集合,集合中的元素需要定义加法和乘法运算.向量空间和n维数组空间R^n不是同一个概念 ...
- CSS3中渐变gradient详解
这几天看了一本HTML5的书,里面对于页面的背景使用了大量的渐变效果,因此在这里写一些关于渐变Gradient的东西. CSS3中的Gradient有两种,分别是线性渐变(linear-gradien ...
- (转载)一步一步学Linq to sql系列文章
现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...
- Fragment 总结
本博客代码地址 : -- 单一 Fragment 示例 : https://github.com/han1202012/Octopus-Fragement.git -- 可复用的 Fragment 示 ...
- 总结一下block的几种常用方法
一.block的简单介绍 block相当于一个参数,有参数的名,有参数的值,有参数的使用,当使用block的时候,它又相当于一个函数,会回调函数体. 声明:void (^block)(void); 实 ...