XAML實例教程系列 - 標記擴展(Markup Extensions)
2012-06-21 13:00 by jv9, 1298 閱讀, 1 評論, 收藏, 編輯做爲描述性語言,XAML使用對象元素聲明和其屬性調用實現不一樣操做。在實際項目開發中XAML爲控件屬性賦值,常常會遇到設計時屬性值處於未知狀態,而該屬性值只有在應用運行時才能獲取到,經過簡單的XAML屬性賦值語法沒法實現用戶需求,使用XAML標記擴展(Markup Extensions)能夠輕鬆實現XAML頁面屬性賦值,資源引用,類型轉換等操做。html
本篇將詳細講解Windows 8應用開發,XAML的標記擴展基礎概念和使用方法。(Windows 8和Silverlight 5具備相似的標記擴展概念,若是你已經具備Silverlight經驗,經過本文能夠快速掌握標記擴展在WinRT中的使用方法。)windows
標記擴展(Markup Extensions)基礎概念app
在.Net Framework中,標記擴展功能來自MarkupExtension抽象類,根據功能的不一樣,從中派生出子類。在.Net Framwork 4.5中MarkupExtension派生類(MSDN引用)以下:ide
而在Windows 8應用開發中,經常使用的XAML標記擴展功能包括:post
1. Binding(綁定)標記擴展, 實如今XAML載入時,將數據綁定到XAML對象;學習
2. StaticResource(靜態資源)標記擴展, 實現引用數據字典(ResourceDictionary)中定義的靜態資源;spa
3. TemplateBinding(模板綁定)標記擴展, 實如今XAML頁面中,對象模板綁定調用;.net
4. RelativeSource(綁定關聯源)標記擴展,實現對特定數據源綁定;設計
XAML標記擴展語法格式:code
標記擴展(Markup Extensions)實例
例以下面代碼,簡單演示使用Binding標記擴展:
<TextBox Text =" {Binding ElementName=sliderOneTimeDataSource, Path=Value, Mode=OneTime} " HorizontalAlignment ="Left" VerticalAlignment ="Top" Width ="150" />
以上代碼中,第一行經過使用Binding標記擴展的Path屬性將UserName綁定到元素對象TextBox的Text依賴屬性中,使文本內容在運行時動態顯示到客戶端。
而第二行代碼使用Binding標記擴展中EelementBinding(對象元素綁定)功能,綁定對象sliderOneTimeDataSource.Value到TextBox的Text屬性中,使文本內容在滑動條內容改變時,TextBox內容同步改變。
另一個實例,StaticResource(靜態資源)標記擴展,
< ListBox.ItemTemplate >
< DataTemplate >
< Border Background =" {Binding Color} " Width ="200" CornerRadius ="10" HorizontalAlignment ="Left" >
< TextBlock Text =" {Binding Name} " Style =" {StaticResource BasicTextStyle} " HorizontalAlignment ="Center" FontWeight ="Bold" />
</ Border >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
上面代碼中,TextBlock引用靜態樣式資源,Style="{StaticResource BasicTextStyle}",和Web應用CSS樣式文件相似,大量樣式代碼定義在外部資源文件中,使用標記擴展應用對象元素樣式。這樣的設計方式,方便開發人員代碼設計和維護。
BasicTextStyle代碼以下:
< Setter Property ="Foreground" Value =" {StaticResource ApplicationForegroundThemeBrush} " />
< Setter Property ="FontSize" Value =" {StaticResource ControlContentThemeFontSize} " />
< Setter Property ="FontFamily" Value =" {StaticResource ContentControlThemeFontFamily} " />
< Setter Property ="TextTrimming" Value ="WordEllipsis" />
< Setter Property ="TextWrapping" Value ="Wrap" />
< Setter Property ="Typography.StylisticSet20" Value ="True" />
< Setter Property ="Typography.DiscretionaryLigatures" Value ="True" />
</ Style >
相比較前兩種標記擴展,TemplateBinding標記擴展使用具備侷限性,必須應用於ControlTemplate中,不然XAML將解析報錯。
下面代碼,在一個按鈕(Button)的ControlTemplate中使用TemplateBinding標記擴展,功能實現將Button.Content內容綁定到TextBlock的Text屬性中,從而實現自定義控件樣式模板效果。

RelatvieSource標記擴展是較爲特殊的一個Markup Extension。 在前面的代碼中,咱們使用了ElementBinding元素綁定一個對象屬性到另一個對象屬性。值得留意的是,ElementBinding元素綁定只有在源對象被命名後才能正常使用。
而對RelativeSource則容許綁定未命名源對象屬性到目標對象屬性。
-或-
< object property =" {Binding RelativeSource={RelativeSource Self} ...} " ... />
-或-
< object property =" {Binding RelativeSource={RelativeSource TemplatedParent} ...} " ... />
RelativeSource使用Self模式時, 目標對象將做爲源對象綁定到自身。這個模式能夠實現同一對象元素不一樣屬性之間的綁定操做。例如:
以上代碼,附加屬性ToolTipService.ToolTip使用RelativeSource標記擴展綁定控件自身Text屬性,做爲提示信息顯示在客戶端。
RelativeSource使用TemplatedParent模式時, 僅在控件模板(ControlTemplate)或者數據模板(DataTemplate)下有效。不一樣的模板,將返回不一樣類型的綁定結果。例如,在一個ListBox數據模板(DataTemplate)中應用RelativeSource的TemplatedParent模式,則會返回ContentPresenter模板內容到對應數據模板中。TemplatedParent模式能夠幫助開發人員輕鬆綁定模板中的屬性值到目標對象屬性。例如:
< Setter Property ="Template" >
< Setter.Value >
< ControlTemplate TargetType ="local:Calendar" >
< Grid >
< TextBlock Text =" {Binding Path=Namer,RelativeSource={RelativeSource TemplatedParent},Mode=TwoWay} " />
< TextBlock Text =" {TemplateBinding Namer} " />
....
</ Style >
值得注意的是,在控件模板(ControlTemplate)中使用RelativeSource的TemplatedParent模式,」Binding RelativeSource={RelativeSource TemplatedParent}}「等價於」{TemplateBinding}"標記擴展。
二者不一樣在於,TemplateBinding僅支持單向(One-Way)綁定,而RelativeSource標記擴展支持雙向(Two-Way)綁定,這個功能在建立自定義控件模板時特別有用。
內置標記擴展(Markup Extensions)
在WinRT中, x:null是XAML最基礎的標記擴展,其做用是設置一個nullable值到對象屬性,能夠用於初始化對象屬性值。例如:
< object.property >
< x:Null />
</ object.property >
</ object >
使用XAML標記擴展功能,能夠在應用運行時爲對象屬性賦值,實現動態更新XAML屬性,對於應用實時數據更新提供很大的幫助。
今天就講到這裏,歡迎各位留言討論。
![]() |
源代碼下載(VS2012 RC, Windows8 RP) |
運行效果:

XAML實例教程系列:
歡迎你們留言交流,或者加入QQ羣交流學習:
22308706(一羣) 超級羣500人
37891947(二羣) 超級羣500人
100844510(三羣) 高級羣200人
32679922(四羣) 超級羣500人
23413513(五羣) 高級羣200人
32679955(六羣) 超級羣500人
88585140(八羣) 超級羣500人
128043302(九羣 企業應用開發推薦羣) 高級羣200人
101364438(十羣) 超級羣500人
68435160(十一羣 企業應用開發推薦羣)超級羣500人