闲话WPF之七(XAML的向前兼容性)

前一个Post当中 ,我们简单介绍了 XAML 的向后兼容性,以及利用标记兼容性实现注释的功能。现在,我们接着讨论 XAML 的向前兼容性问题。

同样地,我们用一个简单的例子来帮助说明 XAML 的向前兼容性。假设有一个自定义的 CLYLButton ,实现了一个 Light 属性。在 V1 版本它的默认属性值是 Blue (蓝光)。在 V2 版本中支持属性值 Green (绿光)。假设我们在程序中利用 Light 属性实现了绿光效果。但是,如果恰好目标机器上的 V2 版本意外地被替换为了 V1 版本。此时,程序的行为应该怎么样呢?崩溃,不,我们希望它在没有 V2 的情况下能利用 V1 版本的默认值实现蓝光效果。如何实现且看 XAML 标记的向前兼容性。向前兼容性表示通过标记兼容性名字空间的 Ignorable 属性标识元素、属性和类,使它们可以动态的支持向前版本。

<CLYLButton V2:Light="Green" 
      xmlns="...assembly-v1-uri..."
      xmlns:V2="...assembly-V2-uri..."
      xmlns:mc=http://schemas.micrsoft.com/winfx/2006/markup-compatibility
      mc:Ignorable="V2" />

这就利用了标记兼容性名字空间的Ignorable属性。mc:Ignorable=”V2”表示所有用V2前缀关联的名字空间中元素或者属性都是可以忽略的。如果现在只有V1版本的CLYLButton,上面的代码就被XAML加载器解释为:

<CLYLButton Light=”Blue” xmlns=”… assembly-V1-uri …”/>

如果现在有V2版本的CLYLButton,上面的代码将被XAML加载器解释为:

<CLYLButton Light=”Green” xmlns=”… assembly-V2-uri …”/>

XMAL标记兼容性除了可应用在属性上,还可以应用在元素之上。仍然通过例子进行说明,定义如下的一个类:

[ContentProperty("Buttons")]
    public class CElement {
        List<CLYLButton> _buttons = new List<CLYLButton>();
        public List<CLYLButton> Buttons { get { return _buttons; }
}

关于ContentProperty的用法可以参考MSDN文档ContentPropertyAttribute Class

同样,我们可以如下编写XAML代码,使其可以同时兼容两个版本的CElement。

<CElement mc:Ignorable="V2"
      xmln="...assembly-v1-uri..."
      xmlns:V2="...assembly-V2-uri..."
      xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
      <CLYLButton Light="Blue" />
      <V2:CLYLButton Light="Green"/>
</CElement>

这样,如果加载器有V2版本,则Green属性值生效。如果没有则被忽略。类似地,我们还可以完全自动地处理名字空间的类:

<CElement mc:Ignorable="v2"
      xmln="...assembly-v1-uri..."
      xmlns:V2="...assembly-v2-uri..."
      xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
      <V2:Favor/>
</CElement>

加载时,如果没有V2版本存在,Favor类实例同样将被忽略。

在Markup Compatibility中,除了有前面介绍的Comment、Ignorable属性修饰外,另一个有趣的就是AlternateContent。利用AlternateContent,我们能方便的实现可选内容。比如,我们的程序使用了V2版本Assembly的CLYLButton类,但是,如果没有找到这个Assembly,那么它对应的内容自动用另一个指定版本V1替换,而不是兼容性体现的忽略。看下面的例子:

<CElement mc:Ignorable="v2"
      xmln="...assembly-v1-uri..."
      xmlns:v2="...assembly-v2-uri..."
      xmlns:mc="http://schemas.micrsoft.com/winfx/2006/markup-compatibility">
      <mc:AlternateContent>
            <mc:Choice Requires="V2">
                <CLYLButton Light="Green" Shape="Dog" />
                <V2:Favor/>
            </mc:Choice>
            <mc:Fallback>
                <CLYLButton Light="Blue"/>
            </mc:Fallback>
       </mc:AlternateContent>
</CElement>

这一段XAML代码在有V1版本的Assembly时将被视为:

<CElement xmln="...assembly-v1-uri...">
        <CLYLButton Light="Blue"/>
</CElement>

如果有V2版本的Assembly,编译的结果如下:

<CElement xmln="...assembly-v1-uri...">
        <CLYLButton Light="Green"/>
       <Favor/>
</CElement>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值