WPF 依賴屬性前言

2022-03-15 07:06:18 字數 2890 閱讀 4975

​ 在.net中,我們可以屬性來獲取或設定欄位的值,不需要在編寫額外的get和set方法,但這有乙個前提,那就是需要在物件中擁有乙個字段,才能在此字段的基礎上獲取或設定欄位的值,比如:

// 字段

private int _age = 23;

// 屬性

public int age

set

}

​ 但在wpf中,微軟引入了一種依賴屬性的方法來獲取或者設定控制項的值,之所以叫做依賴,是因為這個值能夠從其他資料來源中獲取值(依賴在別人身上)而在控制項物件上不儲存這個值,所以依賴屬效能有效地較少記憶體開銷。

依賴屬性先簡單說到這裡,有時我們往往只是記住了結論而忽略了推導過程,下面的我對推到過程的一些思考:

**如果讓我們自己來實現依賴屬性,我們該怎麼實現呢? **

首先能確定的是,我們不能定義控制項擁有的所有字段,如果定義了,那麼控制項物件被建立時,所有欄位都會被初始化,都會有乙個初始值,記憶體就會被浪費,這樣不行,所以我就想到了用字典dictionary的方式來儲存需要的值。用int來儲存乙個索引值,保證控制項中的每個屬性索引值都不一樣;用object來儲存屬性的值。

由於每種控制項都需要此字典來儲存值,所以控制項要有乙個基類,這裡我取名mydependencyobject,它的結構大致應該是這樣:

/// /// 依賴物件

///

public class mydependencyobject

public void setvalue(int index, object value)

}

然後我們應該確定的是,控制項的每個屬性都應該有個索引值啊,這樣才能在_keyvalue字典中找到對應的值。然後又想到這個索引值應該是和物件無關的,是和類相關的,所以應該是一種靜態的方式來得到這個索引值,所以實現的方式大概是這樣:

/// /// 依賴物件

///

public class mydependencyobject

public void setvalue(int index, object value)

// 某種演算法根據屬性名獲取乙個索引值

protected static int getindex(string propertyname)

}/// /// 按鈕控制項

///

public class mybutton : mydependencyobject

set}

}

在基類mydependencyobject中定義乙個靜態方法getindex,子類根據屬性的名字來獲取唯一的索引,然後在根據索引值來獲取和設定值。

雖然上面的方式已經可以達到節省記憶體的目的,但是對於屬性更多的控制,比如屬性的預設值、值變化**、是否是唯讀的等等這些都達不到要求,所以屬性應該被定義成更複雜的型別以完成更多的功能,而不是是用乙個int的索引就完成了,所以我把這個更複雜的型別定義為mydependencyproperty,它的結構如下:

/// /// 依賴屬性

///

public class mydependencyproperty

/// /// 建構函式

///

public mydependencyproperty(string propertyname, type owntype, mypropertymetadata data)

/// ///屬性名

///

public string name

/// /// 擁有者型別

///

public type owntype

/// /// 屬性資料

///

public mypropertymetadata defaultmetadata

/// /// 使用某種演算法按照屬性名獲取乙個索引值

///

///

///

///

private static int getindex(string propertyname, type owntype)

}/// /// 屬性資料

///

public class mypropertymetadata

/// /// 預設值

///

public object defaultvalue

// 其他的值 ...

}

mydependencyproperty中包含了靜態字段dictionary_indexproperty,它儲存了索引-依賴屬性的集合,整個應用程式只包含乙個集合。通過靜態方法getindex(string propertyname, type owntype)計算索引值,計算索引值需要屬性名和擁有者型別,這樣可以計算出唯一的索引。

像下面這樣使用上面的依賴屬性:

/// /// 依賴物件

///

public class mydependencyobject

else

}public void setvalue(mydependencyproperty dp, object value)

}/// /// 按鈕控制項

///

public class mybutton : mydependencyobject

set}

}

WPF 依賴屬性

原文 wpf 依賴屬性 屬性和事件是.net抽象模型的核心部分,wpf在這之上增加了dependency property 依賴屬性 依賴屬性使用更高效的儲存機制,並且支援附加的功能,更改通知 屬性值繼承 在元素樹中向下傳播預設屬性值 以及減少屬性儲存空間。依賴屬性是wpf動畫 資料繫結和樣式的基礎...

WPF依賴屬性

依賴屬性是一種可以自己沒有值,並能通過使用binding從資料來源獲取值 依賴在別人身上 的屬性。優點 wpf的所有控制項都是依賴屬性。依賴物件被dependencyobject類實現,依賴屬性由dependencyproperty類實現。dependencyobject有getvalue setv...

WPF 依賴屬性

屬性是我們再熟悉不過的了,那麼究竟依賴屬性怎麼寫呢?依賴屬性和屬性到底有什麼區別和聯絡呢?其實依賴屬性的實現很簡單,只要做以下步驟就可以實現 第一步 讓所在型別繼承自 dependencyobject基類,在wpf中,我們仔細觀察框架的類圖結構,你會發現幾乎所有的 wpf 控制項都間接繼承自depe...