前一个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>

转载于:https://www.cnblogs.com/YilingLai/archive/2006/12/21/599117.html

闲话WPF之七(XAML的向前兼容性)相关推荐

  1. 闲话WPF之十(Dependency属性 [2] )

    在前一个Post中,曾提到将要重点研究Dependency属性的三个方面:变化通知:属性值的继承:支持多个提供对象.下面,我将分别就这三个内容进行简单地说明. [变化通知] 在任何时候,只要Depen ...

  2. 第一章:初识WPF,XAML,WPF控件

    前言 总目录 本章主要介绍WPF与XAML,以及WPF的控件的基本使用,让大家先初步认识WPF. 关于WPF的官方资料:官方WPF文档1 .官方WPF文档2.官方WPF文档3.官方WPF文档4 一.W ...

  3. wpf中xaml的类型转换器与标记扩展

    wpf中xaml的类型转换器与标记扩展 原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是 ...

  4. 兼容性向前还是向后_向后兼容性与向前兼容性

    兼容性向前还是向后 When building a client-server application, the client and server need to agree on how to t ...

  5. 闲话WPF之六(XAML的标记兼容性(Markup Compaibility))

    继续XAML的话题,在前一个Post当中简单介绍了XAML的类型转换器(TypeConverters).这次介绍一些XAML标记兼容性(Markup Compatibility)的相关内容. 利用XA ...

  6. 闲话WPF之五(XAML中的类型转换)

    在前面关于XAML的Post当中,简单说明了XAML如果引入自定义名称空间.还提到过XAML基本上也是一种对象初始化语言.XAML编译器根据XAML创建对象然后设置对象的值.比如: <Butto ...

  7. 闲话WPF之二四(WPF中的ControlTemplate [2])

    前面关于ControlTempalte的Post当中,只说明了如何定义的外观.如果对于很复杂的自定义控件,通常我们还需要在ControlTemplate使用Resource.很显然,Resource的 ...

  8. WPF之XAML语法

    目录 树形结构 对象属性赋值语法 使用标签的Attribute 使用属性元素 扩展:标记扩展(Markup Extensions) 扩展:使用TypeConverter 类映射Atribute与Pro ...

  9. 闲话WPF之十三(WPF中的资源)

    资源是保存在可执行文件中的一种不可执行数据.通过资源我们可以包含图像.字符串等等几乎是任意类型的数据.如此重要的功能,.NET Framework当然也是支持的,其中内建有资源创建.定位.打包和部署的 ...

最新文章

  1. Panabit 安装笔记之FreeBsd 6.2的安装
  2. 面试必问:十大经典排序算法总结
  3. atitit.ajax bp dwr 3.的注解方式配置使用流程总结.....
  4. PMAboutView
  5. SSH远程登录解析(linux)
  6. 实例讲解如何通过Oracle成功发送邮件-入门基础
  7. 使用Java WebSockets,JSR 356和JSON映射到POJO的
  8. nginx header参数丢失_某Nginx后门分析与重现
  9. 2012总结--第5篇--人脉篇
  10. linux命令别名永久生效
  11. AWVS Linux 破解版在 Centos7 下安装过程中存在问题记录
  12. Multisim入门
  13. 最新计算机毕业设计源码开源啦,java毕业设计,python毕业设计,c++毕业设计,php毕业设计,Android毕业设计,小程序毕业设计
  14. Appium原理精讲
  15. PHP制作QQ微信支付宝三合一收款码
  16. WordPress 安装时常见的数据库的错误
  17. Postgresql管理系列-第三章Query Processing(下半部分-join operation介绍)
  18. android 自定义心电图,Android动态滚动波形图(心电图)的实现
  19. 后台nodejs存储图片以及前端显示
  20. mapBox使用笔记

热门文章

  1. 网络驱动器设备:iscsi服务器
  2. Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(2)RPD资料档案库创建
  3. vmware智能资源调整
  4. 小小树微博制作记录笔记(一)
  5. 【知识小课堂】 之 聚合函数
  6. 【性能优化】 之 HINTS 相关作业
  7. Charles 抓包 从入门到精通
  8. /usr/lib/deepin-wine/wine: error while loading shared libraries: libwine.so.1
  9. vs项目中头文件(.h)静态库(.lib)和 动态库(.dll )的路径和配置
  10. 彻底理解cookie、session、token