闲话WPF之七(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的向前兼容性)相关推荐
- 闲话WPF之十(Dependency属性 [2] )
在前一个Post中,曾提到将要重点研究Dependency属性的三个方面:变化通知:属性值的继承:支持多个提供对象.下面,我将分别就这三个内容进行简单地说明. [变化通知] 在任何时候,只要Depen ...
- 第一章:初识WPF,XAML,WPF控件
前言 总目录 本章主要介绍WPF与XAML,以及WPF的控件的基本使用,让大家先初步认识WPF. 关于WPF的官方资料:官方WPF文档1 .官方WPF文档2.官方WPF文档3.官方WPF文档4 一.W ...
- wpf中xaml的类型转换器与标记扩展
wpf中xaml的类型转换器与标记扩展 原文:wpf中xaml的类型转换器与标记扩展 这篇来讲wpf控件属性的类型转换器 类型转换器 类型转换器在asp.net控件中已经有使用过了,由于wpf的界面是 ...
- 兼容性向前还是向后_向后兼容性与向前兼容性
兼容性向前还是向后 When building a client-server application, the client and server need to agree on how to t ...
- 闲话WPF之六(XAML的标记兼容性(Markup Compaibility))
继续XAML的话题,在前一个Post当中简单介绍了XAML的类型转换器(TypeConverters).这次介绍一些XAML标记兼容性(Markup Compatibility)的相关内容. 利用XA ...
- 闲话WPF之五(XAML中的类型转换)
在前面关于XAML的Post当中,简单说明了XAML如果引入自定义名称空间.还提到过XAML基本上也是一种对象初始化语言.XAML编译器根据XAML创建对象然后设置对象的值.比如: <Butto ...
- 闲话WPF之二四(WPF中的ControlTemplate [2])
前面关于ControlTempalte的Post当中,只说明了如何定义的外观.如果对于很复杂的自定义控件,通常我们还需要在ControlTemplate使用Resource.很显然,Resource的 ...
- WPF之XAML语法
目录 树形结构 对象属性赋值语法 使用标签的Attribute 使用属性元素 扩展:标记扩展(Markup Extensions) 扩展:使用TypeConverter 类映射Atribute与Pro ...
- 闲话WPF之十三(WPF中的资源)
资源是保存在可执行文件中的一种不可执行数据.通过资源我们可以包含图像.字符串等等几乎是任意类型的数据.如此重要的功能,.NET Framework当然也是支持的,其中内建有资源创建.定位.打包和部署的 ...
最新文章
- Panabit 安装笔记之FreeBsd 6.2的安装
- 面试必问:十大经典排序算法总结
- atitit.ajax bp dwr 3.的注解方式配置使用流程总结.....
- PMAboutView
- SSH远程登录解析(linux)
- 实例讲解如何通过Oracle成功发送邮件-入门基础
- 使用Java WebSockets,JSR 356和JSON映射到POJO的
- nginx header参数丢失_某Nginx后门分析与重现
- 2012总结--第5篇--人脉篇
- linux命令别名永久生效
- AWVS Linux 破解版在 Centos7 下安装过程中存在问题记录
- Multisim入门
- 最新计算机毕业设计源码开源啦,java毕业设计,python毕业设计,c++毕业设计,php毕业设计,Android毕业设计,小程序毕业设计
- Appium原理精讲
- PHP制作QQ微信支付宝三合一收款码
- WordPress 安装时常见的数据库的错误
- Postgresql管理系列-第三章Query Processing(下半部分-join operation介绍)
- android 自定义心电图,Android动态滚动波形图(心电图)的实现
- 后台nodejs存储图片以及前端显示
- mapBox使用笔记
热门文章
- 网络驱动器设备:iscsi服务器
- Oracle BIEE (Business Intelligence) 11g 11.1.1.6.0 学习(2)RPD资料档案库创建
- vmware智能资源调整
- 小小树微博制作记录笔记(一)
- 【知识小课堂】 之 聚合函数
- 【性能优化】 之 HINTS 相关作业
- Charles 抓包 从入门到精通
- /usr/lib/deepin-wine/wine: error while loading shared libraries: libwine.so.1
- vs项目中头文件(.h)静态库(.lib)和 动态库(.dll )的路径和配置
- 彻底理解cookie、session、token