XAML實例教程系列 - 標記擴展(Markup Extensions) 六

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  Path =UserName}」/>

<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  Height ="200"  ItemsSource =" {Binding Source={StaticResource teamsCVS}} " >
                     < 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代碼以下:

複製代碼
     < Style  x:Key ="BasicTextStyle"  TargetType ="TextBlock" >
         < 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則容許綁定未命名源對象屬性到目標對象屬性。 

 

在Windows 8中, RelatvieSource標記擴展具備兩種應用模式,分別是Self Mode和TemplatedParent Mode。 其調用語法格式和前文相似,

 

< Binding  RelativeSource =" {RelativeSource Self} "  ... />
-或-
< object  property =" {Binding RelativeSource={RelativeSource Self} ...} "  ... />

 

< Binding  RelativeSource =" {RelativeSource TemplatedParent} "  ... />
-或-
< object  property =" {Binding RelativeSource={RelativeSource TemplatedParent} ...} "  ... />

 

RelativeSource使用Self模式時, 目標對象將做爲源對象綁定到自身。這個模式能夠實現同一對象元素不一樣屬性之間的綁定操做。例如:

< TextBox  Text =" {Binding Path=UserName} "  ToolTipService.ToolTip =" {Binding Text, RelativeSource={RelativeSource Self}} "   />

以上代碼,附加屬性ToolTipService.ToolTip使用RelativeSource標記擴展綁定控件自身Text屬性,做爲提示信息顯示在客戶端。 

 

RelativeSource使用TemplatedParent模式時, 僅在控件模板(ControlTemplate)或者數據模板(DataTemplate)下有效。不一樣的模板,將返回不一樣類型的綁定結果。例如,在一個ListBox數據模板(DataTemplate)中應用RelativeSource的TemplatedParent模式,則會返回ContentPresenter模板內容到對應數據模板中。TemplatedParent模式能夠幫助開發人員輕鬆綁定模板中的屬性值到目標對象屬性。例如:

複製代碼
< Style  TargetType ="local:Calendar" >
         < 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 >
   < 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人

 

 
 
標籤:  Silverlight教程xamlwindows8WinRT
 
相關文章
相關標籤/搜索