你的位置:首页 > ASP.net教程

[ASP.net教程]WPF:实现自定义标记扩展


标记扩展使用{标记扩展类 参数}语法,如:

<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中一个语法糖而已。

运行效果: