文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>不为人知的Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异

不为人知的Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异

时间:2010-09-30  来源:永恒的记忆

Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异

Silverlight

根据您的应用程序是面向 Silverlight 3 还是 Silverlight 4,Silverlight 使用不同的 XAML 分析器。这两个分析器在 Silverlight 4 核心库中并存以实现兼容。为 Silverlight 版本 3 编译并以该版本为目标的应用程序使用特定于 Silverlight 版本 3 的 XAML 分析器。为 Silverlight 版本 4 编译并以该版本为目标的应用程序使用特定于 Silverlight 版本 4 的 XAML 分析器。本主题介绍 Silverlight 3 和 Silverlight 4 之间的 XAML 处理差异。

语法差异

以下各节说明在 Silverlight 3 和 Silverlight 4 中具有不同处理方式的 XAML 语言形式和语法差异。

混合的内容和属性元素

Silverlight 3 支持 XAML 中的混合内容和属性元素;但 Silverlight 4 XAML 和 [MS-XAML] 不支持。例如,下面的 XAML 可以在 Silverlight 3 中分析,但不能在 Silverlight 4 中分析:

复制
<Grid x:Name="LayoutRoot">    <TextBlock>        <TextBlock.Text>            <Binding Path="Text" ElementName="tb" />        </TextBlock.Text>    </TextBlock>    <Grid.RowDefinitions>        <RowDefinition />        <RowDefinition />    </Grid.RowDefinitions>    <TextBox x:Name="tb" Grid.Row="1" /><!--this is a second content set, invalid in v4--></Grid>

推断的属性元素 xmlns

Silverlight 3 能容忍 XAML 中的属性元素不指定其父对象元素的 XAML 命名空间信息。Silverlight 4 对此不能容忍,并且将引发 XAML 分析异常。例如,下面的 XAML 在 Silverlight 3 中有效,但在 Silverlight 4 中无效:

<controls:WrapPanel Width="100" Height="100"

xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls">

<WrapPanel.Background><!--needs prefix...-->

<SolidColorBrush Color="Red" />

</WrapPanel.Background>

</controls:WrapPanel>

虚假的属性 xmlns

在某些情况下,Silverlight 3 能容忍 XAML 中无法解析的属性具有 xmlns。 在这些情况下,Silverlight 3 将使用回退至对象元素 xmlns。

Silverlight 4 对此不能容忍,并且将引发 XAML 分析异常。

只读集合的集合对象的显式对象元素

在 Silverlight 3 中,允许只读集合属性包含集合类型的对象元素。这有悖于对象元素实例化类型的某一实例这一一般原则,对只读集合是无效的。Silverlight 3 将对此引发分析异常。例如,下面的内容在 Silverlight 3 中有效,但在 Silverlight 4 中无效:

复制
<DoubleAnimationUsingKeyFrames>  <DoubleKeyFrameCollection>    <DiscreteDoubleKeyFrame Value="100" KeyTime="0:0:2" />    <DiscreteDoubleKeyFrame Value="400" KeyTime="0:0:4" />  </DoubleKeyFrameCollection></DoubleAnimationUsingKeyFrames>

内容属性的字符串内容

Silverlight 版本 3 仅对某些对象(特别是 TextBlockRun 这两个对象)支持对象元素的字符串内容。其他对象不支持内容字符串。例如,<Button>Hello</Button> 在 Silverlight 3 中无效,必须改用 <Button Content="Hello" /> 形式。Silverlight 4 通常没有此限制。但是,请不要将这一点解释为任何 Silverlight 4 控件都可以接受内容字符串。特定控件是否可接受内容字符串取决于其对象模型,这一注意事项比是否可以将相应的属性设置为 XAML 内容字符串更为重要。

请注意,XAML 初始化文本类似于字符串内容形式,但这并不是真正要设置为 XAML 内容属性的字符串。有关更多信息,请参见 XAML 概述

空白处理

更准确地说,Silverlight 3 所认定的空白的外延更大,其中包括 CLRF 被视为有效的那些情况。这有时会导致文件格式 XAML 省略 CRLF(这是为了避免在演示中出现不需要的空格,但这会导致在编辑环境中不可读)。Silverlight 4 使用类似于 WPF 的更为直观的有效空白模型。此模型在多数情况下折叠文件格式空白,只有在某些具有 CLR 属性的容器将所有空白视作有效的情况例外。这种空白模型向编辑环境提供了更大的自由度,以便引���可以改进 XAML 代码格式的空白。此外,Silverlight 4 还具有一些文本元素,可加强对空白演示问题的控制。

说明:

xml:space 允许作为进行 Silverlight XAML 分析的属性,但 Silverlight 3 中的空白保留行为永远不将 xml:space 用作一个确定因素。相比之下,Silverlight 4 遵循 xml:space="preserve",并使用此值来改写其默认空白折叠行为。

XAML 语言实体

在 Silverlight 3 中,忽略来自 XAML 语言 XAML 命名空间 (x:) 的不存在的实体。如果 Silverlight 的 XAML 语言定义中不具有该实体,则 Silverlight 4 将对此引发分析异常。(注意:在 Silverlight 3 和 Silverlight 4 中均允许 x:Uid。但是,没有任何 Silverlight API 或行为能对 x:Uid 进行读取或写入操作。)

x:Key 作用域

Silverlight 3 仅允许在 ResourceDictionary 的作用域中使用 x:Key。Silverlight 4 还在任何元素用法中支持 x:Key,其中后备类型实现 IDictionary

x:Name 行为/XAML 名称范围

在 Silverlight 3 中,非 DependencyObject 的 XAML 对象元素在语法级别不支持 x:Name。相反,Silverlight 4 接受该语法,但不能将该对象添加到 XAML 命名空间。

标记扩展

Binding 以外,Silverlight 3 中的标记扩展只能在属性语法中使用,而不能在对象元素语法中使用。除 Binding 以外,这些标记扩展的构造函数参数不能使用命名参数语法。例如,{StaticResource aKey} 有效,而 {StaticResource ResourceKey=aKey} 无效。

XAML 命名空间

Silverlight 3 对 XAML 命名空间声明强加了以下限制,这有别于 Silverlight 4:

  • 根元素必须始终包含默认命名空间声明。不假定任何隐式值。

  • 任何默认命名空间声明(无论是否针对根元素)都必须为 http://schemas.microsoft.com/winfx/2006/xaml/presentation、http://schemas.microsoft.com/client/2007 或(很少使用的)XPS 命名空间 (http://schemas.microsoft.com/xps/2005/06)。

  • Silverlight 应用程序清单尽管在技术上是 XAML,但它的根通常是 Deployment 对象,因此通常必须使用默认的 XAML 命名空间 xmlns="http://schemas.microsoft.com/client/2007/deployment" 以便进行解析。

  • Silverlight 4 可能也有类似的限制,但这些限制仅应用于针对 Page 生成操作的 XAML 标记编译行为,而一般不存在于在运行时使用的 XAML 分析器中。

标记编译或分部类行为

在使用 x:Class 时,Silverlight 3 支持这样一种行为:如果对根元素的子类设置某属性,即便该属性在根标记上不存在也能解析为该子类的属性。Silverlight 4 将对此引发异常。下面的示例在 Silverlight 3 中有效,但在 Silverlight 4 中将引发异常。

复制
public class MyPage : UserControl{    public int Value { get; set; }}
复制
<UserControl x:Class="SilverlightApplication1.MyPage " ... Value="17" ></UserControl>

在 Silverlight 3 中,接受 XAML 中根标记的类型与代码隐藏中的类的类型不匹配,并且不报错。在 Silverlight 4 中,分析器通常就会引发异常。下面的示例在 Silverlight 3 中有效,但在 Silverlight 4 中将引发异常。

复制
namespace MyNS{    public class Page : Canvas { etc. etc. }}
复制
<UserControl x:Name="parentCanvas" x:Class=" MyNS.Page" ... />
分析和查找行为

以下各节介绍针对支持代码的分析评估和查找,这在 Silverlight 3 和 Silverlight 4 中的处理方式有所不同。

重复属性集

在某些情况下,如果某个属性是具有专用的非本机实现的非核心属性,则可以在 Silverlight 3 XAML 中多次设置该属性。Silverlight 4 从不允许这样做,并将引发 XAML 分析异常。

计算枚举值

当 Silverlight 3 分析具有初始化文本值的枚举时,它会生成一个整数值。Silverlight 4 则会生成枚举值。如果访问代码隐藏中的值或在 UI 中显示计算的枚举,则需要考虑到上面这一点。 但是,后者一般不是可取的 UI 做法。

TypeConverters 或演示图板的类型检查

Silverlight 3 接受并非 Storyboard 的可视状态,以及并非 TypeConverterTypeConverterAttribute 属性化类。这两者都可能引起运行时问题,但在 XAML 中允许用于属性编译和加载。Silverlight 4 对这些情况将引发异常。

对附加属性的支持

在 Silverlight 3 中,仅可以使用 XAML 中具有静态 setter 的附加属性。在 Silverlight 4 中,这些属性需要一个静态 getter 和一个静态 setter。此外,Silverlight 3 具有一个特定的要求,即可以使用依赖项属性后备来实现附加属性。Silverlight 4 没有这一限制。

来自绑定属性的 StaticResource 查找

在 Silverlight 3 中,未成功引用 StaticResource 的 Binding 的子属性在 XAML 分析期间不引发任何错误。绑定的行为就如同未设置子属性一样。这不是典型的 StaticResource 行为,而且可能会干扰绑定的调试。Silverlight 4 将对未成功引用 StaticResource 的 Binding 的子属性情况引发分析异常。

系统基元

映射的 System 命名空间(Silverlight 中的 mscorlib 程序集组合)支持的构造(通常映射为 sys:)只有 sys:Double、sys:String、sys:Boolean 和 sys:Int32。(此处的目的是为了使用定义为对象元素的"基元",通常是为了用作资源字典中的资源。)

模板行为

  • 在 Silverlight 3 中,允许对不具有 CLR 访问器的属性进行 TemplateBinding。Silverlight 4 不允许这样做。

  • 在 Silverlight 3 中,允许不可分析的模板作为资源存在。Silverlight 4 不允许这样做。

  • Setter.Property 和 TemplateBinding 中的属性名称在 Silverlight 3 中不区分大小写;但在 Silverlight 4 中处理时需区分大小写。

  • 在 Silverlight 3 中,动画或演示图板中的未解析或键入有误的 TemplateBinding 不会设置此属性。在 Silverlight 4 中通常就会引发异常。

  • 在 Silverlight 3 中,如果创建具有以基类为目标的 TargetType 的 ControlTemplate,并使用针对子类成员的 TemplateBinding,TemplateBinding 可能仍将该属性解析为准动态行为。Silverlight 4 将此视为错误,以便设计人员注意到这一点,并相应地引发异常。没有显式 TargetType(相对于 TargetType="Control")的情况也包括在内。

  • 在 Silverlight 3 中,针对模板中其他位置定义的静态资源的前向引用不会加载失败。Silverlight 4 对此将引发异常。请注意,对于此情况,Silverlight 3 的运行时行为是不确定的。因此,Silverlight 4 在您生成模板时尝试捕获这一不可预知的运行时行为。针对静态资源进行前向引用的 Silverlight 3 模板将继续有效(如果以前有效),除非其他因素更改了应用程序生存期和计时,从而改变了该不确定行为。

UserControl 行为

  • UserControl.Content 在 Silverlight 3 中是受保护属性,但在 Silverlight 4 中是公共属性。作为内部分析器行为,只要为 x:Class 指定了一个值,Silverlight 3 XAML 分析器(及标记编译���)就可以使用其 XAML 内容为 UserControl 设置 UserControl.Content

Silverlight XAML 和 WPF XAML

Silverlight 版本和 WPF 之间的 XAML 处理差异主题中介绍了 Silverlight XAML 和 WPF XAML 之间的差异。如果是比较 Silverlight 3 XAML 和 WPF XAML,应阅读 Silverlight 版本和 WPF 之间的 XAML 处理差异以及本主题,并考虑这两方面的不同之处。

 

本文来自MSDN

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载