WPF學習之依賴屬性和附加屬性

2022-02-13 18:20:39 字數 4359 閱讀 5811

依賴屬性(dependency property)

.net framework 3.0

引入了乙個新的屬性型別叫依賴屬性

, wpf,wf

都在使用依賴屬性用來實現樣式化

,資料繫結等

.我們更多的使用依賴屬性是為了讓父元素的屬性值在邏輯樹上慢慢的傳遞到其子元素中

,從而可以在整個可是父元素的邏輯子元素中共享屬性值

.wf就是依靠依賴屬性來在工作流中的各

activity

間傳遞屬性值的

. 所以

,依賴屬性內建的傳遞變更通知的能力是其最大特徵

.如果你想讓屬性在乙個包含內容子控制項樹的整個邏輯控制項樹中都有效並共享值時

,你僅僅只需要將這個屬性宣告為依賴屬性即可

,wpf

會通過內建的架構來支援屬性的共享

. 而在工作流中我們經常需要用到依賴屬性

,它保證了在乙個工作流例項中

,多個元件共享了同乙個值

. 幸運的是在

wpf中大部分空間的屬性都是依賴屬性,這讓我們應用時非常方便,而你並不需要著後邊發生了什麼。

a)

依賴屬性的實現

依賴屬性其實也是普通的

.net屬性,

只是通過

dependencyproperty.register

方法將普通的

.net

屬性註冊為依賴屬性。在依賴屬性的宣告中,其實對應的普通

.net

屬性並不是必需的,因為其內部的

getvalue

和setvalue

方法是公開的,依賴屬性的使用者可以通過呼叫

getvalue/setvalue

而放棄對普通

.net

屬性的依賴。但建立在普通

.net

熟悉之上更符合我們通常的做法,而且這樣有利於在

xaml

中設定屬性。

下面的**展示了定義依賴屬性的通常做法:

public class button:buttonbase

//.net屬性(

可選)public bool isdefault

set }//

屬性改變時的**

private static void onisdefaultchanged(dependencyobject o,

dependencypropertychangedeventargs e)

}在上面的示例**中是標準的實現依賴屬性定義的方法,這裡需要注意的是依賴屬性始終是定義在普通

.net

屬性之上的用

register

靜態方法註冊的特殊屬性,即便這裡的

.net

屬性(如

isdefault

屬性)不是必需的。另乙個需要注意的地方是,通過宣告依賴屬性,我們多了乙個控制屬性改變時的**方法(即便這同樣可以通過宣告委託和事件來定義,但這裡我們什麼都沒做,為什麼不用呢?),這樣的好處是我們可以在屬性改變的時候做些我們想做的事情,而我們卻省去了手動宣告事件的任務。其實**函式的存在是為了讓我們保證在屬性包裝器中

(isdefault屬性)

僅僅使用標準的

getvalue/setvalue

而不用任何其他邏輯,轉而將自定義邏輯寫入**函式

--這樣做是為了遵循

wpf的統一設計原則,讓

xaml 

設定屬性與使用過程式**設定屬性保持一致。

b)

觸發器

依賴屬性的實現讓我們可以在乙個區域性範圍內保持屬性值的共享

,這樣的好處是對於記憶體的節約,因為

getvalue/setvalue

內部使用了高效的稀疏儲存系統

. 前邊提到過

,依賴屬性的一大特徵是變更通知

,意思就是當某些依賴屬性的只改變了

,wpf

就會更具屬性的元資料觸發一系列動作

.wpf

中有三種方式來實現這樣的變更通知:l

屬性觸發器

: 在屬性發生改變時執行自定義動作,而不用改任何過程**。

l資料觸發器

: 當普通

.net

屬性的值改變時呼叫自定義動作。

l事件觸發器

: 當路由事件被觸發時呼叫自定義動作。

屬性觸發器

(trigger)

當某個屬性有乙個特定的值時,屬性觸發器會執行乙個

setter

的集合來設定相關物件的屬性,而當屬性失去這個值的時候,屬性觸發器會撤消該

setter

集合. 

這樣的好處是大大簡化了我們用宣告事件的辦法來處理滿足一定條件時的邏輯,我們在

xaml

中就可以完成相應的簡單邏輯(如果複雜還是需要過程式**)。

下邊的示例顯示了旋轉變換僅在滑鼠移到按鈕上方時才會發生,並會設定相應屬性。

對於屬性觸發器的應用我們更多的還可以通過自定義驗證規則來實現對樣式和

tooltip

的自動設定。

資料觸發器

(data trigger)

資料觸發器與屬性觸發器幾乎一樣

,只是資料觸發器可以由任何

.net

屬性觸發

,而不僅僅是依賴屬性

.為了使用資料觸發器,可向

triggers

集合中新增

datatrigger

物件然後指定屬性/值對

.同時可以用

binding

來指定相關屬性而不僅僅是屬性名

.以下示例通過

binding

指定當自己的值為

disabled

的時候將自己禁用

. 注意

:text

屬性不是依賴屬性

.事件觸發器

(event trigger)

當乙個已選擇的事件產生時事件觸發器會被啟用

.這個事件由觸發器的

routeevent

屬性指定,他在

action

集合中包含乙個或多個動作

(從抽象類

triggeraction

繼承來的物件

).下邊的示例展示了在

button

的click

事件被觸發時執行

doubleanimation動作.

okduration="0:0:5" autoreverse="true" />

c)

屬性值繼承

2.

附加屬性(attached property)

附加屬性也屬於

xaml

為了擴充套件其能力的一種,它提供了讓使用者在父屬性裡設定自己沒有的子屬性值的能力。而在應用附加屬性時,通常它也可以體現

wpf中屬性傳遞的優點:例如,當你給乙個

panel

中的某類元素設定了附加屬性,那麼在不顯式宣告相關屬性值(重寫)的情況下,此類元素共同從父元素得到這個值。

作為附加屬性,之所以說是擴充套件了

xaml

的應用是因為它提供了通過父元素來設定子元素並在其可視樹範圍內預設共享的能力。那麼我們可以通過給

panel

來設定textelement.fontsize

屬性來讓所有在這個

panel

下的擁有

textelement.fontsize」10

」>

fireworks

sleek, with a black sky containing fireworks. when you need to

celebrate powerpoint-style, this design is for you!

」btnsubmit

」>agree

」btncancel

」>disagree

在上述的例子中,由於在

stackpanel

中設定了

textelement.fontsize,

所以在它的內部的可視控制項自動有用這個屬性:

textblock,button

都會以fontsize=10

來顯示。

wpf 依賴屬性和附加屬性

原文 wpf 依賴屬性和附加屬性 1 依賴屬性 解釋 依賴屬性是配合binding出現的產物,功能主要是配合binding。作用 一 當自定義usercontrol時,需要與宿主 父窗體 雙向繫結值時,用到依賴屬性。2 附加屬性 解釋 附加屬性是配合控制項或自定義型別出現的產物 作用 1 主要是擴充...

wpf 依賴屬性和附加屬性

1 依賴屬性 解釋 依賴屬性是配合binding出現的產物,功能主要是配合binding。作用 一 當自定義usercontrol時,需要與宿主 父窗體 雙向繫結值時,用到依賴屬性。2 附加屬性 解釋 附加屬性是配合控制項或自定義型別出現的產物 作用 1 主要是擴充套件控制項時用的較多,比如擴充套件...

WPF 依賴屬性和附加屬性

依賴屬性 依賴屬性就是自己沒有值,通過binding從資料來源獲得值,就是依賴在別人身上,擁有依賴屬性的物件稱為依賴物件。依賴屬性的值存在 在wpf執行時,維護了乙個全域性的hashtable訪問依賴屬性的值。二 附加屬性 附加屬性就是自己沒有這個屬性,在某些上下文中需要就被附加上去。比如textb...