初步了解WPF依赖属性
一 依賴屬性
? ? 在WPF庫實(shí)現(xiàn)中,依賴屬性使用普通的C#屬性進(jìn)行了包裝,使得我們可以通過和以前一樣的方式來使用依賴屬性。但必須明確,在WPF中我們大多數(shù)都在使用依賴屬性,而不是使用屬性。依賴屬性重要性在于,在WPF核心特性,如動(dòng)畫、數(shù)據(jù)綁定以及樣式中都需要使用到依賴屬性。WPF中的依賴屬性主要有以下三個(gè)優(yōu)點(diǎn):
? ? 依賴屬性加入了屬性變化通知、限制、驗(yàn)證等功能。這樣可以使我們更方便地實(shí)現(xiàn)應(yīng)用,同時(shí)大大減少了代碼量。許多之前需要寫很多代碼才能實(shí)現(xiàn)的功能,在WPF中可以輕松實(shí)現(xiàn)。
? ? 節(jié)約內(nèi)存:在WinForm中,每個(gè)UI控件的屬性都賦予了初始值,這樣每個(gè)相同的控件在內(nèi)存中都會(huì)保存一份初始值。而WPF依賴屬性很好地解決了這個(gè)問題,它內(nèi)部實(shí)現(xiàn)使用哈希表存儲(chǔ)機(jī)制,對(duì)多個(gè)相同控件的相同屬性的值都只保存一份。
? ? 支持多種提供對(duì)象:可以通過多種方式來設(shè)置依賴屬性的值。可以配合表達(dá)式、樣式和綁定來對(duì)依賴屬性設(shè)置值。
二 如何自己定義一個(gè)依賴屬性
? ? 在C#屬性定義的基礎(chǔ)上;
? ? 讓依賴屬性的所在類型繼承自DependencyObject類;
? ? 使用public static 聲明一個(gè)DependencyProperty的變量,該變量就是真正的依賴屬性;
? ? 在類型的靜態(tài)構(gòu)造函數(shù)中通過Register方法完成依賴屬性的元數(shù)據(jù)注冊(cè);
? ? 提供一個(gè)依賴屬性的包裝屬性,通過這個(gè)屬性來完成對(duì)依賴屬性的讀寫操作;
? ? 依賴屬性是通過調(diào)用DependencyObject的GetValue和SetValue來對(duì)依賴屬性進(jìn)行讀寫的。它使用哈希表來進(jìn)行存儲(chǔ)的,對(duì)應(yīng)的Key就是屬性的HashCode值,而值(Value)則是注冊(cè)的DependencyPropery;而C#中的屬性是類私有字段的封裝,可以通過對(duì)該字段進(jìn)行操作來對(duì)屬性進(jìn)行讀寫。總結(jié)為:屬性是字段的包裝,WPF中使用屬性對(duì)依賴屬性進(jìn)行包裝。
三 依賴屬性優(yōu)先級(jí)
? ? 按從高到低排序:
1 屬性系統(tǒng)強(qiáng)制轉(zhuǎn)換。強(qiáng)制轉(zhuǎn)換和動(dòng)畫在本 SDK 中都作用于稱為“基值”的值。便于動(dòng)畫不受別的設(shè)置影響。
2 活動(dòng)動(dòng)畫或具有 Hold 行為的動(dòng)畫。為了獲得任何實(shí)用效果,屬性的動(dòng)畫必須優(yōu)先于基(未動(dòng)畫)值,即使該值是在本地設(shè)置的情況下也將如此。
3 本地值。本地值可以通過“包裝”屬性 (Property) 的便利性進(jìn)行設(shè)置,這也相當(dāng)于在 XAML 中設(shè)置 Attribute 或 Property 元素,或者使用特定實(shí)例的屬性調(diào)用 SetValue API。如果您使用綁定或資源來設(shè)置本地值,則每個(gè)值都按照直接設(shè)置值的優(yōu)先級(jí)順序來應(yīng)用。
4 TemplatedParent 模板屬性。如果元素是作為模板(ControlTemplate 或 DataTemplate)的一部分創(chuàng)建的,則具有 TemplatedParent。在模板中,按以下優(yōu)先級(jí)順序應(yīng)用:
? ? 1 來自 TemplatedParent 模板的觸發(fā)器。
? ? 2 TemplatedParent 模板中的屬性 (Property) 集。(通常通過 XAML 屬性 (Attribute) 進(jìn)行設(shè)置。)
5 隱式樣式。僅應(yīng)用于Style屬性。Style屬性是由任何樣式資源通過與其類型匹配的鍵來填充的。該樣式資源必須存在于頁面或應(yīng)用程序中;查找隱式樣式資源不會(huì)進(jìn)入到主題中。
6 樣式觸發(fā)器。來自頁面或應(yīng)用程序上的樣式中的觸發(fā)器。(這些樣式可以是顯式或隱式樣式,但不是來自優(yōu)先級(jí)較低的默認(rèn)樣式。)
7 模板觸發(fā)器。來自樣式中的模板或者直接應(yīng)用的模板的任何觸發(fā)器。
8 樣式 Setter。來自頁面或應(yīng)用程序的樣式中的 Setter 的值。
9 默認(rèn)(主題)樣式。在默認(rèn)樣式中,按以下優(yōu)先級(jí)順序應(yīng)用:
? ? 1 主題樣式中的活動(dòng)觸發(fā)器。
? ? 2 主題樣式中的 Setter。
10 繼承。有幾個(gè)依賴項(xiàng)屬性從父元素向子元素繼承值,因此不需要在應(yīng)用程序中的每個(gè)元素上專門設(shè)置這些屬性。
11 來自依賴項(xiàng)屬性元數(shù)據(jù)的默認(rèn)值。任何給定的依賴項(xiàng)屬性都具有一個(gè)默認(rèn)值,它由該特定屬性的屬性系統(tǒng)注冊(cè)來確定。而且,繼承依賴項(xiàng)屬性的派生類具有按照類型重寫該元數(shù)據(jù)(包括默認(rèn)值)的選項(xiàng)。因?yàn)槔^承是在默認(rèn)值之前檢查的,所以對(duì)于繼承的屬性,父元素的默認(rèn)值優(yōu)先于子元素。因此,如果任何地方都沒有設(shè)置可繼承的屬性,將使用在根元素或父元素中指定的默認(rèn)值,而不是子元素的默認(rèn)值。
四 一個(gè)簡(jiǎn)單實(shí)例
<Pagexmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"><Grid> <Button x:Name="myButton" Background="Green" Width="400" Height="300"><Button.Style><Style TargetType="{x:Type Button}"><Setter Property="Background" Value="Yellow"/><Style.Triggers><Trigger Property="IsMouseOver" Value="True"><Setter Property="Background" Value="Red" /></Trigger></Style.Triggers></Style></Button.Style>Click Me </Button></Grid> </Page>? ? 代碼在三個(gè)地方設(shè)置了按鈕的顏色;按鈕最終為綠色;
?
總結(jié)
以上是生活随笔為你收集整理的初步了解WPF依赖属性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC6生成和调用lib
- 下一篇: WPF资源的基本概念