日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

WPF之依赖属性和附加属性

發(fā)布時(shí)間:2024/4/17 asp.net 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WPF之依赖属性和附加属性 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

???????參考資料:

?????? 一站式WPF--依賴屬性(DependencyProperty)一

?????? 一站式WPF--依賴屬性(DependencyProperty)二

??????? 依賴屬性之我見

這兩篇文章介紹的了依賴屬性的本質(zhì)和由來,挺清晰的。

自我理解:依賴屬性,說明有兩個(gè)關(guān)系,依賴和屬性。

依賴的由來:

在面向?qū)ο蟮氖澜缋?#xff0c;屬性大量存在,比如Button,就大約定義了70-80個(gè)屬性來描述其狀態(tài)。那么屬性的不足又在哪里呢?

  當(dāng)然,所謂的不足,要針對(duì)具體環(huán)境來說。拿Button來講,它的繼承樹是Button->ButtonBase->ContentControl->Control->FrameworkElement->UIElement->Visual->DependencyObject->…

  每次繼承,父類的私有字段都被繼承下來。當(dāng)然,這個(gè)繼承是有意思的,不過以Button來說,大多數(shù)屬性并沒有被修改,仍然保持著父類定義時(shí)的默認(rèn)值。通常情況,在整個(gè)Button對(duì)象的生命周期里,也只有少部分屬性被修改,大多數(shù)屬性一直保持著初始值。每個(gè)字段,都需要占用4K等不等的內(nèi)存,這里,就出現(xiàn)了期望可以優(yōu)化的地方:

  • 因繼承而帶來的對(duì)象膨脹。每次繼承,父類的字段都被繼承,這樣,繼承樹的低端對(duì)象不可避免的膨脹。????
  • 大多數(shù)字段并沒有被修改,一直保持著構(gòu)造時(shí)的默認(rèn)值,可否把這些字段從對(duì)象中剝離開來,減少對(duì)象的體積

?????? 有了以上的背景,依賴就出現(xiàn)了,微軟設(shè)計(jì)了DependencyProperty類,?里面有著 public static DependencyProperty Register(string name, Type propertyType, Type ownerType, object defaultValue)方法來注冊(cè)屬性。然后又定義了一個(gè)DependencyObject的基類來消費(fèi)這個(gè)屬性。這樣繼承自DenpendencyObject的類就可以注冊(cè)自己的依賴屬性,屬性是自己注冊(cè)的,其實(shí)嚴(yán)格的說并不是自己的,所以節(jié)省了空間。注冊(cè)的屬性在DependencyProperty里面通過一個(gè)hash(?internal static Dictionary<object, DependencyProperty> RegisteredDps = new Dictionary<object, DependencyProperty>())來維護(hù)。注冊(cè)過的屬性都存在這個(gè)hash里面。自此依賴我感覺的由來就清楚了,不是自己的屬性,而是此屬性要依賴于DependencyProperty的。

?????? 依賴解釋好了,那屬性呢?其實(shí)屬性就是對(duì)外暴漏接口罷了,注冊(cè)依賴屬性后就是給依賴屬性賦值(set),或者問依賴屬性取值(get),這些操作封裝到了DependencyObject類里面,所有用過的屬性的值都通過?List<EffectiveValueEntry> _effectiveValues = new List<EffectiveValueEntry>()來存儲(chǔ)和維護(hù)。這樣就不會(huì)污染最初的默認(rèn)value。這里也就實(shí)現(xiàn)了某個(gè)屬性變化的過程都可以DependencyObject里面的effectiveValues找到痕跡,這樣也就支持了動(dòng)畫。獲取和賦值都是通過EffectiveValueEntry這個(gè)入口來獲得的。就此依賴屬性設(shè)計(jì)好了。

?????? 這樣的設(shè)計(jì)聽好了,但是我們想要求子類也有自己的默認(rèn)屬性,比如很多控件都有Name屬性,但有時(shí)候并不希望大家的默認(rèn)值是一樣的,但是有共用同一個(gè)DP。這該怎么解決呢?

???????要想支持不同的默認(rèn)值,那么內(nèi)部就要維護(hù)一個(gè)對(duì)應(yīng)不同DependencyObjectType的一個(gè)List,可以根據(jù)傳入的DependencyObject的類型來讀取它對(duì)應(yīng)的默認(rèn)值。DP內(nèi)需要維護(hù)一個(gè)自描述的List,按照微軟的命名規(guī)則,添加新的類型屬性元數(shù)據(jù)(PropertyMetadata)。其實(shí)在DependencyProperty里面添加了private List<PropertyMetadata> _metadataMap = new List<PropertyMetadata>();來維護(hù)元數(shù)據(jù),實(shí)現(xiàn)對(duì)默認(rèn)值的修改。

??????附加屬性之我見:說白了就是依賴屬性的改造,只是封裝不同,區(qū)別在于附加二字,其實(shí)就是有些對(duì)象不具備某些屬性,有些對(duì)象具備這些屬性,那么具備這些依賴屬性的對(duì)象就可以某些屬性附加到不具備這些屬性的對(duì)象上。比如人沒有年級(jí),班級(jí)的屬性,而學(xué)校有年級(jí)班級(jí)的屬性,但是當(dāng)人在學(xué)校學(xué)習(xí)的時(shí)候就具備了班級(jí)年級(jí)的屬性,這個(gè)時(shí)候?qū)W校這個(gè)對(duì)象就可以附加給人這個(gè)對(duì)象班級(jí)年級(jí)的屬性。這就是附加屬性。

??????回想下依賴屬性,依賴屬性是對(duì)一個(gè)對(duì)象來說的,這個(gè)對(duì)象可以注冊(cè)依賴屬性,以后這個(gè)對(duì)象就具備了這個(gè)屬性。而附加屬性是對(duì)兩個(gè)對(duì)象來說的,一個(gè)是附加對(duì)象,一個(gè)是被附加對(duì)象。是不是可以這樣理解,附加對(duì)象給被附加對(duì)象注冊(cè)了一個(gè)依賴屬性罷了。但這個(gè)依賴屬性依靠附加對(duì)象操作。自己的理解不知道正確與否。

往更深層次的,就看看開頭兩篇的博客吧。

轉(zhuǎn)載于:https://www.cnblogs.com/fuchongjundream/p/3892949.html

總結(jié)

以上是生活随笔為你收集整理的WPF之依赖属性和附加属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。