在Silverlight 5中新增了自定義擴充标記,它通過繼承于 MarkupExtension 類,重載該類中的ProvideValue方法以判斷得到相應的傳回值,以設定被綁定控件的屬性。
下面我們通過一個最為簡單的執行個體來了解自定義擴充标記是如何工作的。
第一步:建立一個UserMarkExtension.cs類,注意UserMark(擴充标記名)+Extension.cs(固定的字尾)=UserMarkExtension.cs
第二步:設定3個可被通路的屬性标簽LBText,LBWidth,RcRadius
第三步:重載PrivideValue函數,設定傳回的屬性值,
三個步驟的UserMarkExtension.cs類代碼如下:
/// <summary>
/// 第一步:建立一個UserMarkExtension.cs類
/// 注意UserMark(擴充标記名)+Extension.cs(固定的字尾)=UserMarkExtension.cs
/// </summary>
public class UserMarkExtension : MarkupExtension
{
//第二步:設定3個可被通路的屬性LBText,LBWidth,RcRadius
public string LBText { get; set; }
public double LBWidth { get; set; }
public double RcRadius { get; set; }
//第三步:重載PrivideValue函數,設定傳回的屬性值
public override object ProvideValue(IServiceProvider serviceProvider)
//如果前台調用自定義标記時LBText值為Text,
if (LBText == "Text")
return LBText = "我是一個Text";
}
else if (RcRadius > 0)
return RcRadius = 15;
else
return LBWidth = 99;
第四步:為需要設定自定義擴充标記的控件設定{local:UserMark LBText=Text},其含義為設定定制擴充标記local:UserMark,其屬性LBText的值為Text,根據此值可以查詢自定義擴充标記 中PrivideValue函數,于是得到傳回值“我是一個Text”。同理綁定其他屬性值!現在我們看MainPage.xaml的代碼如下:
<Grid x:Name="LayoutRoot" Background="White">
<!--第四步:Content="{local:UserMark LBText=Text}",
設定定制擴充标記local:UserMark,設定其屬性LBText的值為Text"-->
<sdk:Label Height="47" HorizontalAlignment="Left"
Content="{local:UserMark LBText=Text}" Margin="70,106,0,0"
Name="label1" VerticalAlignment="Top" Width="100" />
Content="{local:UserMark LBWidth=1}" Margin="70,159,0,0"
Name="label2" VerticalAlignment="Top" Width="100" />
<Rectangle Height="67" HorizontalAlignment="Left"
Fill="DarkRed" RadiusX="{local:UserMark RcRadius=1}"
RadiusY="{local:UserMark RcRadius=1}" Margin="223,106,0,0"
Name="rectangle1" Stroke="Black" StrokeThickness="1"
VerticalAlignment="Top" Width="116" />
</Grid>
在本執行個體中我們僅僅是最簡單的示範了自定義擴充标記的使用方法和運作原理,個人覺得這個功能将會對MVVM的支援非常有益,大家可以試着擴充一下。
<a target="_blank" href="http://blog.51cto.com/attachment/201204/213822200.jpg"></a>
本文轉自程興亮 51CTO部落格,原文連結:http://blog.51cto.com/chengxingliang/826415