没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
原创|其它|编辑:郝浩|2010-02-03 10:42:22.000|阅读 866 次
概述:在c#中--得益于c#3.0中的自动属性--我们可以十分轻松的通过如下代码创建一个叫做“AuthorName”的属性。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
在c#中--得益于c#3.0中的自动属性--我们可以十分轻松的通过如下代码创建一个叫做“AuthorName”的属性。
public string AuthorName { get; set; }
上面的代码就是我们熟悉的CLR属性,我们可以很方便的读/取这个属性的值。不过在silverlight的世界中如果你想做更多更牛的事情,CLR属性就显得有些力不从心了。它们包括--动画、数据绑定、样式/模板等等。
因此,微软在WPF中提出了依赖属性(Dependency Property,以下简称DP)的概念并将其延伸至Silverlight平台。在这篇文章我将介绍DP在Silverlight的定义和使用。
要了解一件新事物最简单的方式就是找出一样我们熟悉的,与要介绍的新玩意相似的东西来做对比:将上文的AuthorName属性定义为DP的方式是如下这样的
public string AuthorName { get { return (string)GetValue(AuthorNameProperty); } set { SetValue(AuthorNameProperty, value); } }
public static readonly DependencyProperty AuthorNameProperty = DependencyProperty.Register("AuthorName", typeof(string), typeof(AuthorTextField), new PropertyMetadata(""));
哇!完成一个DP的定义需要这么多的代码,kidding me?
先别急,下面我们就来了解一下这些代码的含义。
首先,要构造一个DP,我们需要准备两样事
通过CLR属性包装
将DP用代码片段1中所示代码包装起来后,我们便可以轻松的像CLR属性一样设置和获取DP的值。因为这个包装用的就是标准的CLR声明方式,只是他的get和set中有一些简单的逻辑而已罢了。这里我们需要分别使用GetValue和SetValue方法获取或这是一个叫做AuthorNameProperty属性的值(没错,这是个DP。Silverlight中约定DP要以-Property词缀结尾)。
定义依赖属性(即本文中的AuthorNameProperty)
现在来看代码片段2,这里我们将其分成若干部分来解释:
public static readonly DependencyProperty AuthorNameProperty
代码片段3
先看看这部分,在定义DP时我们通常需要的返回类型是DependencyProperty(另外一种式附加属性AttachedProperty),而它的修饰符是public, static, 和 readonly。
然后我们看接下来的部分:
DependencyProperty.Register("AuthorName",
typeof(string),
typeof(AuthorTextField),
new PropertyMetadata(""));
这样看来定义一个DP其实并不困难,通常我们只需按部就班的按照约定和格式完成定义而不需了解这背后可能令人头疼的具体细节--Silverlight的底层属性机制会确保这些DP在应用程序中的各尽其责。
现在,我们应该对DP的定义有了一个大体的了解。下面我们会将注册DP的代码部分(即代码片段4)进行详细剖析。
我们先来看一下Register()方法的定义
public static DependencyProperty Register(string name,
Type propertyType,
Type ownerType,
PropertyMetadata typeMetadata);
代码片段5
Register()方法接受三个参数
public class PropertyMetadata { public PropertyMetadata(object defaultValue); public PropertyMetadata(PropertyChangedCallback propertyChangedCallback); public PropertyMetadata(object defaultValue, PropertyChangedCallback propertyChangedCallback); public object DefaultValue { get; } }
代码片段6
下面我们来做一个试验以便了解注册依赖属性时附加元数据的能力。
在没有默认值的情况下,我们在Expression Blend中观察这个AuthorName属性:
接下来我们做如下定义
new PropertyMetadata("Sir Arthur Conan Doyle")
同样打开Expression Blend进行围观:
与我们通过PropertyMetadata构造函数构造的默认值相同。
由于在我们的例子中,AuthorName的类型是string,所以我们PropertyMetadata构造函数中的设置其默认值的类型也是string。而在上面我们已经知道,PropertyMetadata构造函数中接受的参数是object,所以在具体应用中我们应该根据实际情况决定传入的默认值(对象)。
另外一个可以指定给PropertyMetadata的参数对象是一个回调方法。这个方法将在DP的值发生变化时被调用。举个例子
new PropertyMetadata(new PropertyChangedCallback(AuthorNameChanged)
代码片段7
在上面的代码中,我们传入了一个类型为PropertyChangedCallback并命名为AuthorNameChanged的回调函数。然后,理所当然的,我们需要定义这个函数。
private static void AuthorNameChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e) { // 一切皆有可能! 024hi.cnblogs.com 紫色永恒 }
代码片段8
由于我们定义的DP(以及注册DP的代码)是静态的,所以这里定义的事件(AuthorNameChanged)也必须是静态的。
这个回调方法需要传入两个参数。第一个参数是对具体DependendyObject的引用,第二个参数是特定委托的参数集DependencyPropertyChangedEventArgs。
有了静态修饰符及这两个参数,我们的AuthorNameChanged方法就定义完成了。每当AuthorName这个DP发生变化时,这个方法都会被调用。
最后,根据代码段6的定义,我们可以将定义默认值及回调函数的方式通过同一个构造函数传入。
DependencyProperty.Register("AuthorName",
typeof(string),
typeof(AuthorTextField),
new PropertyMetadata("Sir Arthur Conan Doyle", new PropertyChangedCallback(AuthorNameChanged)));
Okay!Have fun~
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:互联网面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号