社区
C#
帖子详情
【兄弟们】问一下。为什么WPF/Silverlight非要用到DependencyProperty?和普通Property有什么区别?能不能形象易懂的说明一下啊?我太笨了,看书也看不明白。
adultsite
2009-03-04 11:10:30
如题吧。
大家帮帮忙。thank you very much.
...全文
253
10
打赏
收藏
【兄弟们】问一下。为什么WPF/Silverlight非要用到DependencyProperty?和普通Property有什么区别?能不能形象易懂的说明一下啊?我太笨了,看书也看不明白。
如题吧。 大家帮帮忙。thank you very much.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
adultsite
2009-03-07
打赏
举报
回复
谢谢zhouyongh, qinhl99以及各位兄弟。
目前为止,我可能只是知道怎样定义及初始化DependencyProperty,也知道DP的值来源于各种property provider,如animation, style, data binding,且这些property provider有优先级。
但总体上我还是觉得没抓住重点。等我这方面更多的理顺以后再结贴。
请大家再多踊跃发言,最好能更加“形象”一些。thank you.
li45214521
2009-03-05
打赏
举报
回复
简单来说,就是通知wpf内部3D引擎我的值发生了变化而使用东西
qinhl99
2009-03-05
打赏
举报
回复
以前没有考虑过,刚看了下贴出来:
高效的属性值存储
如果你对.net的属性以及元数据等概念了解比较深,也许你第一反应就是DependencyProperty封装了很多反射功能。是的,不论是"Markup Extension"还是"Setter",还是"Animation",我们仅仅通过XAML或程序中的一些字符串就完成了对属性的访问,这正是反射的特征。由于XAML的需要,或者是WPF team项目经理的需要,WPF team决定在WPF中大量使用反射。要知道,反射一向是C#的“贵族功能”,十分损耗性能,假若所有的属性我们都直接通过反射读取,估计在WPF应用程序在性能上就无法接受了(其实现在WPF应用程序在性能上也不怎么地)。DependencyProperty在底层封装了高效的Hash算法来解决通过字符串获得值的问题,在后面的POST中,我会详细介绍DependencyProperty是如何存储值的。
因此,有了DependencyProperty,我们可以放心的使用"Markup Extension","Setter"等等一系列令人激动的功能了,这影响的功能还不只这些,WPF中实现的数据绑定,动画等等强大功能,都靠这个了。
属性的继承
正如上面Window->Grid->Button的例子,在WPF的逻辑树中,我们将使用DependencyProperty来完成属性的继承。
自动的进行重新布局
这可能不太好解释,如果你了解过WPF的layout机制可能会比较容易理解。
WPF中并没有传统窗体重绘的机制,所谓“重绘”,是通过DependencyProperty的自动更新属性值来进行的。
当WPF中某些视觉元素的属性变化时,WPF系统能够通过DependencyProperty自动进行重新的"Measure"来确定自己的尺寸大小是否发生了变化,或者自动"Arrange"来确定是否要重新排列自己子元素的位置,又或者自动"Render"来重新绘制元素的图形。
举个例子,我们通常把绘制Button的背景色代码写在Button控件的OnRender事件中,当一个Button的Background属性值变化时,通过DependencyProperty可以引起一个自动Render的过程,又比如,一个Grid对象的行数属性或者列数属性发生改时,Grid应该能够自动重新排列他的子元素。
属性值的验证和强制值
DependencyProperty还实现了验证输入值的功能,并且当这些值不满足验证条件时,强制的为属性赋一个满足条件的值。
属性改变通知
DependencyProperty实现的另外一个功能是自动的属性改变通知,也就是当某个属性的值发生变化时执行某个函数或是触发某个事件。
vwxyzh
2009-03-05
打赏
举报
回复
等你用到binding或动画时候,你就知道为什么要这个了
zhouyongh
2009-03-05
打赏
举报
回复
呵呵, 给你解释一下
Dependency Property(DP) 翻译成中文是 依赖属性
属性是名词,依赖相当于形容词。 顾名思义,DP是一个属性。
既然是属性,那它就用来封装字段,表示类的状态。
这个依赖哪来的呢? 谁依赖我,我依赖谁?
当然是你依赖别人,依赖WPF。比方说,控件有一个属性Width,表示宽度,你可以随便设置,当然你设置这个属性是因为你要改变控件的宽度。
如果能被你看见,就需要重新Render,那么是不是这样的方法呢
Public void Width
{
set
{
Render();
}
}
好像没有,所以说,你更改了Width属性后,有种特殊的渠道可以被WPF知道并且Measure,Arrange,Render等等
这就是依赖在起作用,所有Dependency Property都是Register或者RegisterAttach到WPF的。所以属性变化的时候WPF会知道,然后根据你注册(Register)时设置的Meatdata来处理后续的动作(数据校验,刷新等等)
这就是依赖属性的奥秘,当然,本身这东西也很好玩的。值储存在HastTable中,模拟字段使用,节省了继承带来的内存占用等等。
Hope helps
天乐
2009-03-04
打赏
举报
回复
新鲜东西,我没好好看过书,Mark一下等高人
luckapple2
2009-03-04
打赏
举报
回复
因为wpf用的属性系统跟以前的form不一样。wpf用的是依赖属性系统。
jzywh
2009-03-04
打赏
举报
回复
也就是强类型的Key
以前是
Attribute["Canvas.Top"] == ...
Now
Attribute[Canvas.Top] = ...
这样可以在编译时就发现错误,而且还可以限制值得类型。
Roc_Lee
2009-03-04
打赏
举报
回复
[Quote=引用 2 楼 adultsite 的回复:]
前辈们太不关心后辈成长了
[/Quote]
前辈们也不一定用到这个东西啊。帮顶。同等!
adultsite
2009-03-04
打赏
举报
回复
前辈们太不关心后辈成长了
[
WPF
/
Silverlight
]简单说下CLR
Property
与
WPF
Dependency
Property
的
区别
总所周知,在.Net框架下要实现某些特定功能通常都会有n种不同的方式,使用“属性(
Property
)”就是其中之一。你既可以使用CLR
Property
也可以使用
Dependency
Property
。 如果你对这两样东西尚不熟悉的话,就让我们先来简单的介绍
一下
它们。先来瞧瞧我们在.Net中最经常使用的CLR
Property
: public string AuthorName { ...
(转)
Silverlight
中
Dependency
Property
(依赖属性)
原文连接http://virgos.javaeye.com/blog/592047 学习SL/
WPF
,
Dependency
Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。 http://www.
wpf
tutorial.net/
Dependency
Properties.html 这里有一篇通俗
易懂
的相关文章,不过是E文的,E文不好的朋友,也可以参考下面的内容...
Silverlight
:
Dependency
Property
(依赖属性)
学习SL/
WPF
,
Dependency
Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。 http://www.
wpf
tutorial.net/
Dependency
Properties.html 这里有一篇通俗
易懂
的相关文章,不过是E文的,E文不好的朋友,也可以参考下面的内容: 1.为什么会出现依赖属性? 先回想
一下
传统的
Silverlight
:
Dependency
Property
(依赖属性)学习笔记
学习SL/
WPF
,
Dependency
Properties(依赖属性)是一个全新(陌生)但又无法回避的概念。
http://www.
wpf
tutorial.net/
Dependency
Properties.html 这里有一篇通俗
易懂
的相关文章,不过是E文的,E文不好的朋友,也可以参考下面的内容:
1.为什么会出现依赖属性?
先回想
一下
传统的属性(
Property
):通常我们读取或赋值一个属性时,实际上是在对属性背后的某个私有成员进行读写。那么随着对象的属性越来越多,再加上从
WPF
-MvvmLight框架入门教程
在软件工程领域,设计模式是对软件设计中普遍存在的
问
题的典型解决方案。它们不是具体的代码实现,而是一套经过验证的最佳实践。设计模式能够帮助开发者编写出结构清晰、易维护的代码,并且能够让代码具有更好的扩展性和可重用性。MvvmLight是一个流行的MVVM框架,它是由Laurent Bugnion开发的,主要用于简化.NET平台上
WPF
和Windows Phone应用程序的MVVM设计模式开发。MvvmLight的核心目标是减少重复代码,提高开发效率,同时保持代码的清晰性和可维护性。
C#
111,126
社区成员
642,541
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章