提到WPF的几大特性,读者可能认为我会先讲解依赖属性,但我认为当读者进入WPF的大门时,首先应该看到的是标记语言XMAL(Extensible Application Markup Language),这种语言主要的特性就体现在可扩展上。因此我在WPF众多主题中首先选择了Binding类来分解解析。
可能读者还是不明白我为什么先选择这个主题,那么请看下面两个类的继承关系:
当读者看到第二个类的继承关系的时候,应该就明白我选择的原因了,对!因为Binding类间接继承了MarkupExtension,它是我们使用XAML的基础,微软给该抽象类的定义是:
为可以由 .NET Framework XAML 服务及其他 XAML 读取器和 XAML 编写器支持的 XAML 标记扩展实现提供基类。
从上述文字中我们可以看出MarkupExtension是多么的重要,所以,在讲Binding之前,我们按照继承关系先来梳理一下MarkupExtension。言归正传,看看MarkupExtension给我们带来了什么?
看了MarkupExtension类后,读者斗志昂扬的情志瞬间一落千丈,因为MarkupExtension除了一个受保护的无参构造函数外,就给我们提供了一个方法,那就让我们看一下这个方法有何神通吧,先来看看此方法的声明:
serviceProvider参数是为该类及其子类扩展标记提供解析服务的接口,它的目的通过该扩展标记将一种输入转化为另一种类型的输出,即文档中写的目标属性的值(实例)。
举个例子:
我们通过MarkupExtension的另一个简单的子类StaticExtension来说明一下这个方法的魅力。先来看一下StaticExtension的两种等效的用法:
我们再来看下StaticExtension类的声明:
其实第一种方式也可以写成这种:
这样我们就可以看到SystemColors.ActiveCaptionBrush是作为一个字符串传给了该类的Member属性,然后通过ProvideValue方法将该字符串解析成目标属性Foreground的实例。