闲话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中,除了有前面介绍的CommentIgnorable属性修饰外,另一个有趣的就是AlternateContent。利用AlternateContent,我们能方便的实现可选内容。比如,我们的程序使用了V2版本AssemblyCLYLButton类,但是,如果没有找到这个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>


本文转自赖仪灵博客园博客,原文链接:http://www.cnblogs.com/YilingLai/archive/2006/12/21/599117.html,如需转载请自行联系原作者。


目录
相关文章
|
4月前
|
XML 开发框架 .NET
|
6月前
|
IDE C# 开发工具
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
31 0
|
8月前
|
C#
WPF技术之Xaml Window
WPF Window 是一个 WPF 窗口类,它具有许多属性枚举可以控制窗口的外观和行为。
78 0
WPF技术之Xaml Window
|
8月前
|
XML 数据格式 C++
WPF-疑难问题-xaml编码导致中文字符编译无效
WPF-疑难问题-xaml编码导致中文字符编译无效
110 0
|
11月前
|
C#
4.使用代码和未经编译的XAML创建WPF应用程序
4.使用代码和未经编译的XAML创建WPF应用程序
58 0
|
数据采集 人工智能 监控
【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧
随着工业化的进一步发展,制造业、工业自动化等多领域,都可能用到上位监控系统。而WPF在上位监控系统方面,应该算是当下最流行的前端框架之一了。而随着监控体系的不断完善与更新迭代,监控画面会变得越来越复杂、多样化和全面化。
242 0
【WPF】CAD工程图纸转WPF可直接使用的xaml代码技巧
|
C#
【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的
原文:【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的 初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是经常遇到一些明明Trigger已经触发了,但是里面Setter设置的样式,却没有效果的问题。
1216 0
|
16天前
|
C# 开发者 Windows
基于Material Design风格开源、易用、强大的WPF UI控件库
基于Material Design风格开源、易用、强大的WPF UI控件库
|
4月前
|
C#
浅谈WPF之装饰器实现控件锚点
使用过visio的都知道,在绘制流程图时,当选择或鼠标移动到控件时,都会在控件的四周出现锚点,以便于修改大小,移动位置,或连接线等,那此功能是如何实现的呢?在WPF开发中,想要在控件四周实现锚点,可以通过装饰器来实现,今天通过一个简单的小例子,简述如何在WPF开发中,应用装饰器,仅供学习分享使用,如有不足之处,还请指正。
65 1
|
8月前
|
C# Windows
WPF技术之图形系列Polygon控件
WPF Polygon是Windows Presentation Foundation (WPF)框架中的一个标记元素,用于绘制多边形形状。它可以通过设置多个点的坐标来定义多边形的形状,可以绘制任意复杂度的多边形。
457 0