您的位置:首页 > 其它

WPF:实现自定义标记扩展

2015-03-28 21:17 302 查看
标记扩展使用{标记扩展类 参数}语法,如:

<TextBlock Text={x:Null}/>


为什么x:Null就可以返回一个null值呢?

其实在System.Windows.Markup命名空间中存在一个名为“NullExtension”的类型。

在解析到x:Null的时候,实际上会实例化NullExtension的一个对象。

而NullExtension实现了抽象类MarkupExtension,MarkupExtension中提供了抽象方法:

public abstract object ProvideValue(IServiceProvider serviceProvider);


也就是说,NullExtension在实现抽象类的ProvideValue方法时,返回了一个Null而已,所以x:Null在运行时可以代表一个null值。

下面,假设有这样一个需求:实现一个标记扩展类StringExtension,这个扩展类接受一个int参数,然后返回一个string对象。

可以如下实现:

public class StringExtension:MarkupExtension
{
private int n;
public StringExtension(int n)
{
this.n = n;
}

public override object ProvideValue(IServiceProvider serviceProvider)
{
return n.ToString();
}
}


使用方法如下:(假设StringExtension存在于项目根目录下)

<TextBlock Text="{local:String 1}" />


也可以写为:

<TextBlock Text="{local:StringExtension 1}" />


这只是xaml中一个语法糖而已。

运行效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: