XAML實例教程系列 - 依賴屬性和附加屬性


微軟發布Visual Studio 2012 RC和Windows 8 Release Preview版本,從本篇開始,所有實例將基於最新版本開發工具VS2012 RC和Win 8 RP版。

 

 


下載Visual Studio 2012 RC :

 

 

下載Windows 8 Release Preview:

 

在上幾篇XAML實例教程中,分別介紹XAML對象,屬性以及命名空間的概念。從這篇開始,將討論常見的XAML高級話題,其中包括依賴屬性(Dependency Properties), 附加屬性(Attached Properties), 事件處理(Event)等。這些話題是Windows 8和Silverlight實際項目中經常用到的開發知識,也是XAML開發語言的精華。

 

依賴屬性(Dependency Properties)

 

依賴屬性,英文稱為Dependency Properties,是Windows 8,Silverlight特有的屬性系統。在傳統.Net應用開發中,CLR屬性是面向對象編程的基礎,主要提供對私有字段的訪問封裝,開發人員可以使用get和set訪問器實現讀寫屬性操作。在Windows 8應用開發中,依賴屬性和CLR屬性類似,同樣提供一個實例級私有字段的訪問封裝,通過GetValue和SetValue訪問器實現屬性的讀寫操作。 依賴屬性最重要的一個特點是屬性值依賴於一個或者多個數據源,提供這些數據源的方式也可以不同,例如,通過數據綁定提供數據源,通過動畫,模板資源,樣式等方式提供數據源等,在不同的方式數據源下,依賴屬性可以實時對屬性值進行改變。也正是因為依賴多數據源的緣故,所以稱之為依賴屬性。

依賴屬性可以通過多種不同類型的數據源進行賦值,其賦值順序的不同影響着屬性值的改變。為了能夠獲取准確的依賴屬性值,需要了解不同數據源的優先級別,如下圖:

 

 

 

1. 從圖中可以看到,應用動畫占有對以來屬性控制的最高優先級,簡單理解,無論動畫代碼定義在當前頁面內,還是定義在模板代碼內,動畫都將獲得對頁面內依賴屬性的最優先控制權。

 

2. 次一級優先權是依賴屬性本地化操作,分別包括其中包括依賴屬性賦值,數據綁定,資源引用等。依賴屬性使用方式和CLR屬性使用類似,可以使用以下格式對依賴屬性進行賦值操作:

元素對象.依賴屬性 = 屬性值

 

例如: 按鈕控件中,寬度屬性屬於依賴屬性(隨后實例詳解),其賦值方法是: Button.Width = 160;

 

3. 第三優先權是數據模板和控件模板對依賴屬性的控制;

4. 其次是樣式控制器對依賴屬性的控制優先權;

5. 最低的依賴屬性控制優先權是在定義依賴屬性時使用GetValue和SetValue對屬性默認的賦值。

開發人員可以通過對依賴屬性不同優先權的控制,操作頁面屬性值,使控件或者頁面達到需求運行效果。

 

下面實例幫助大家理解Windows 8依賴屬性優先級的應用:

該實例仍舊使用前幾篇中的XamlGuide項目演示,移植到Visual Studio 2012 RC平台,

 

 

定義一個簡單用戶控件樣式 - ButtonStyle,在樣式代碼中,定義了按鈕的內容文本顏色(Foreground)為“Black”黑色,另外定義字體尺寸(FontSize)為24pt, 同時定義按鈕文本內容(Content)是“XAML依賴屬性測試”:


如果應用以上資源樣式到本地按鈕控件,運行結果如下:

 

 

 

但是,如果在<Grid>中定義一個按鈕控件,在該按鈕控件中,定義按鈕文本內容(Content)為“XAML依賴屬性測試”,定義按鈕內容文本顏色(Foreground)為“Yellow”黃色,按鈕文本字體尺寸(FontSize)為14pt,按鈕寬度(Width)為200,同時調用靜態資源樣式ButtonStyle.

 


最終運行結果如下:

 

 

根據前文講述的依賴屬性執行優先級,按鈕控件本地賦值優先於控件樣式,所以以上代碼中,忽略了ButtonStyle樣式,應用本地依賴屬性值生成不同結果。

XAML的附加屬性(Attached Properties)

 

Attached Properties,中文稱為附加屬性,該屬性是一種特殊的依賴屬性,同時也是XAML中特有的屬性之一。其語法調用格式如下:

<控件元素對象 附加元素對象.附加屬性名 = 屬性值 />

 

我們可以通過以下幾個實例理解附加屬性,例如,在布局控件Canvas中定義一個按鈕控件,而按鈕本身沒有任何屬性可以控制其在布局控件Canvas中的位置,而在Canvas中,定義了兩個依賴屬性作為按鈕控件的附加屬性,幫助按鈕控制在Canvas中的位置,其代碼如下:

< Canvas >
    < Button  Canvas.Left =”25”  Canvas.Top =”30”  />
</ Canvas >

在<Button>控件中,使用了 “Canvas.附加屬性”,效果如同按鈕控件從布局控件中繼承了Left和Top兩個屬性值,這時盡管這兩個屬性仍舊屬於Canvas控件,但是屬性值已經附加到了按鈕控件上,並產生了效果。

另外一個附加屬性的實例是TooltipService工具提示服務控件,默認控件生成,不具備動態提示功能,而如果在控件中附加了TooltipService.ToolTip屬性,就可以生成動態顯示指定提示內容的效果。例如:
< Grid  x:Name ="LayoutRoot"  Background =" {StaticResource ApplicationPageBackgroundThemeBrush} " >
         < Button  Content ="XAML依賴屬性測試"  Style =" {StaticResource ButtonStyle} "
                Foreground
="Yellow"  Width ="240"  FontSize ="14"  ToolTipService.ToolTip ="附加屬性效果演示" />
</ Grid >

 

 

和布局控件的Left和Top道理相同,按鈕控件中並沒有ToolTip屬性,只是附加或者可以理解為“繼承”了ToolTipService類,生成以上效果。
從以上示例可以看出,附加屬性主要目的是為了簡化代碼,增強XAML代碼對元素對象的控制。通過對已知類屬性的“繼承”或者“附加”,在元素對象上實現特有的效果。

附加屬性的應用還有許多例如動畫故事板對目標屬性的控制Storyboard.TargetProperty,Grid布局控件的行和列的控制(Row和Column)等。

 

今天暫時介紹到這里,歡迎留言討論。

 

源代碼下載

 

 

 

XAML實例教程系列

 

 

歡迎大家留言交流,或者加入QQ群交流學習:

22308706(一群) 超級群500人 
37891947(二群) 超級群500人 
100844510(三群) 高級群200人 
32679922(四群) 超級群500人 
23413513(五群) 高級群200人 
32679955(六群) 超級群500人 
88585140(八群) 超級群500人 
128043302(九群 企業應用開發推薦群) 高級群200人 
101364438(十群) 超級群500人 
68435160(十一群 企業應用開發推薦群)超級群500人


 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM