[转]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 ...
随机推荐
- 【Android 界面效果23】LayoutInflater作用及使用
作用: 1.对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 2.对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方 ...
- vb.net之窗体继承
相信很多自己动手敲过完整程序的同学都会发现,其实我们敲的很多窗体布局都非常的相似,有的部分用到的控件甚至一模一样,如果每一个窗体都自己重新摆放或者复制粘贴虽然没有问题,但是有时候若是修改其中一小点位置 ...
- vim 使用记录
编辑 Ctrl + x 数字减1 Ctrl + a 数字加1 di + {char} Delete Inner Character # di": & ...
- test命令的用法
test命令可用于:文件属性的测试字符串测试算数测试test命令语法如下所示:test EXPRESSION或者[EXPRESSION] 示例:# test -d "$HOME"; ...
- MySQL 中随机抽样:order by rand limit 的替代方案
最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RA ...
- 提高HTML5 Canvas性能的技巧
详细内容请点击 一:使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码 ...
- 【NodeJS】---express配置ejs mongoose route等
express创建项目 命令行下: express prj_name cd prj_name && npm install ejs html var ejs = require('ej ...
- Android微信支付SDK开发笔记
一.准备工作 1.开发平台及SDK下载 微信开放平台 https://open.weixin.qq.com 下载SDK 微信支付Demo下载 http://pay.weixin.qq.com/wiki ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- 集合框架学习之Guava Collection
开源工具包: Guava : Google Collection Apache:Commons Collecton 1.1 Google Collections Guava:google的工程师利用传 ...