【兄弟们】问一下。为什么WPF/Silverlight非要用到DependencyProperty?和普通Property有什么区别?能不能形象易懂的说明一下啊?我太笨了,看书也看不明白。

adultsite 2009-03-04 11:10:30
如题吧。

大家帮帮忙。thank you very much.
...全文
253 10 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
前辈们太不关心后辈成长了

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧