在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" />
<sdk:Label Height="47" HorizontalAlignment="Left"
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的支持非常有益,大家可以试着扩展一下。
本实例采用VS2010+Silverlight 5.0 beta编写,如需源码请点击 SL5MarkupExt.zip 下载。下面我们看运行效果图: