發(fā)文章
發(fā)文工具
撰寫
網(wǎng)文摘手
文檔
視頻
思維導(dǎo)圖
隨筆
相冊(cè)
原創(chuàng)同步助手
其他工具
圖片轉(zhuǎn)文字
文件清理
AI助手
留言交流
UI軟件中經(jīng)常會(huì)用到大量的控件,,而每一個(gè)控件都是一個(gè)對(duì)象,每一個(gè)類都會(huì)有大量的屬性,,如果沒創(chuàng)建一個(gè)對(duì)象就將所有的屬性都創(chuàng)建出來,,無非會(huì)占用大量的內(nèi)存,wpf使用依賴項(xiàng)屬性來提升了性能,。
查看任何一個(gè)控件的定義,,以button為例,都會(huì)發(fā)現(xiàn)類內(nèi)包含大量的依賴性屬性定義,,注意到其中DependencyProperty都是static readonly的,,而每一個(gè)依賴項(xiàng)屬性都會(huì)有一個(gè)去掉“Property”的CLR屬性和他對(duì)應(yīng),而我們?cè)趚aml中訪問的都是CLR屬性,。
public
static
readonly
DependencyProperty IsCancelProperty;
bool
IsCancel {
get
;
set
; }
如果我們自定義一個(gè)依賴項(xiàng)屬性,,方法是這樣的
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的靜態(tài)方法register將該屬性注冊(cè)到DependencyProperty上,DependencyProperty類的內(nèi)部包含一個(gè)hashtable,,所 有的依賴項(xiàng)屬性都存在這個(gè)哈希表中,,哈希表的key為由DependencyProperty的name和ownertype組成的類,且使用name+ownertype作為的哈希值,這樣就可以確保每個(gè)key是不重復(fù)的
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(); }
依賴項(xiàng)屬性到底是怎么樣節(jié)約內(nèi)存的呢,,由于我們創(chuàng)建控件對(duì)象時(shí)只會(huì)設(shè)置很少一部分屬性,,大部分屬性都是使用默認(rèn)值,默認(rèn)值也就是所有的對(duì)象都是一樣的,那就可以使用靜態(tài)屬性來表示了,,上面提到的存儲(chǔ)依賴項(xiàng)屬性的hashtable就發(fā)揮作用了,,clr將所有沒有設(shè)置的屬性存放在這個(gè)hashtable中,對(duì)于設(shè)置了值的屬性,,則會(huì)為這個(gè)對(duì)象創(chuàng)建一個(gè)數(shù)組,,類型為EffectiveValueEntry,包含了一個(gè)屬性的index,,dependencyproperty提供了一個(gè)方法getglobalindex來獲取此屬性在hashtable中的位置,,value當(dāng)然就可以在此取出。
internal struct EffectiveValueEntry { internal int PropertyIndex { get; set; } internal object Value { get; set; } }
這也是為什么依賴項(xiàng)屬性注冊(cè)為static readonly的卻可以修改的原因,。
依賴項(xiàng)屬性還給我們提供了什么其他好處
數(shù)據(jù)綁定:當(dāng)我們綁定到數(shù)據(jù)源時(shí),,如果數(shù)據(jù)源的變更要想通知到UI,就需要實(shí)現(xiàn)inotifypropertychange接口,,但如果將綁定源聲明為依賴項(xiàng)屬性,,則可以直接通知更新UI。
本地值:動(dòng)畫改變的屬性只是改變臨時(shí)變量,,并未改變屬性值
附加屬性和附加事件:
附加屬性是全局的依賴屬性,,依賴屬性屬于某個(gè)類,而附加屬性可以用在其他對(duì)象上
來自: 昵稱10504424 > 《工作》
0條評(píng)論
發(fā)表
請(qǐng)遵守用戶 評(píng)論公約
一站式WPF
由 WPF 屬性系統(tǒng)支持的屬性稱為依賴項(xiàng)屬性。在DependencyObject加入了一個(gè)_effectiveValues,,就是把所有修改過的DP都保存在EffectiveValueEntry里,,這樣,就可以達(dá)到只保存修改的屬性,,未修改過的屬性...
條款10:理解GetHashCode()方法的缺陷
條款10:理解GetHashCode()方法的缺陷,。(如果我們重寫了Object.operator ==(),將會(huì)破壞GetHashCode()方法,。)只有在結(jié)構(gòu)類型的第一個(gè)字段是只讀的情況下,,ValueType類型的GetHashCode() 才會(huì)正常工作...
[WPF]實(shí)現(xiàn)密碼框的密碼綁定
public static void SetIsPasswordBindingEnabled(DependencyObject obj, bool value) { obj.//when the buffer changed, upate the passwordBox''s password privat...
WPF:依賴屬性
5.生成依賴屬性需要Register方法而不是new,方法的參數(shù)依次是CLR屬性名,、依賴屬性對(duì)應(yīng)的類型(注意:所有依賴屬性真正的類型是DependencyProperty,,這里的意思是依賴屬性所“存儲(chǔ)”的值的類型),、依賴...
閑話WPF之二一(WPF中的數(shù)據(jù)處理 [3])
ComboBox
ComboBox.GUID varchar(50) No varchar(50) Name varchar(50) ...假設(shè)我們從數(shù)據(jù)源中獲取了一個(gè)UserModel的集合(如List<UserModel>),將該集合直接綁定倒ComboBox中,,而不指定它的...
深入淺出WPF之Binding的使用(一)
深入淺出WPF之Binding的使用(一)Binding是一種自動(dòng)機(jī)制,,當(dāng)值變化后屬性要有能力通知Binding,讓Binding把變化傳遞給UI元素,。當(dāng)Name屬性的值發(fā)生變化時(shí)PropertyChanged事件就會(huì)被激發(fā),,Binding接收到...
WPF中的數(shù)據(jù)模板(DataTemplate)
WPF中的數(shù)據(jù)模板(DataTemplate) WPF中的數(shù)據(jù)模板(DataTemplate) ...
WPF附加屬性
WPF附加屬性。自定義附加屬性的時(shí)候需要注意的點(diǎn):建議使用RegisterAttached(String, Type, Type, PropertyMetadata, ValidateValueCallback)而不是RegisterAttached(String, Type, Type, PropertyMeta...
微信掃碼,在手機(jī)上查看選中內(nèi)容
微信掃碼,,在手機(jī)上查看選中內(nèi)容