本文摘自:http://technet.microsoft.com/zh-cn/magazine/ms788723.aspx

XAML 概述 (WPF)中曾介绍过的基本术语。

 

本主题包括下列各节。

 XAML 语言规范

[MS-XAML]。

 XAML 和 CLR

(在 XAML 语言规范的每个级别,XAML 类型都可以映射到任何其他类型系统,而不一定要映射到 CLR,但这需要创建和使用一种不同的 XAML 分析器。)

类型成员和类继承

Control 类继承而来。

另一个原因是,XAML 语言本身的扩展性和类型映射功能会对所允许类型和成员的任何固定表示形式的完整性造成妨碍。

 对象元素语法

最后,必须存在下列一种情况:

  • 元素和标记必须用正斜杠 (/) 和紧跟的右尖括号 (>) 结尾。

  • 对象元素还必须存在等效的结束标记,并与其他开始标记/结束标记对形成正确的嵌套和平衡。

在 XAML 中引用 CLR 类型时,还可以访问该类型的继承成员。

Name 特性及其值:

<Button Name="CheckoutButton"/>

Text

<TextBox>This is a Text Box</TextBox>

 

内容模型

在可用作 XAML 元素的控件和其他 WPF 类的类页面上,将特定元素的内容模型记录为备注的一部分。

根据所设置属性的基础类型系统的特征,可用于特定属性的语法将有所不同。

通常,您的应用程序将使用其他一些实例,而不是任何给定对象的完全默认的实例。

特性值必须是用引号引起来的字符串。

XAML 语法详述注意

XML 字符实体和 XAML

后备类型系统中属性的值必须为值类型,或者必须为可由 XAML 处理器在访问相关后备类型时实例化或引用的引用类型。

对于 WPF XAML 事件,作为特性名称被引用的事件必须是公共事件,并且必须具有公共委托。

属性或事件必须是由包含对象元素实例化的类或结构的成员。

特性值的处理

对于属性,默认处理行为由基础 CLR 属性的类型确定。

特性值由下面的操作之一,按照如下处理顺序进行填充:

  1. 在许多情况下,标记扩展返回的对象是对现有对象的引用或是将计算推迟到运行时的表达式,而不是新实例化的对象。

  2. TypeConverter 声明的,则该特性的字符串值将作为转换输入提交到类型转换器,然后转换器将返回新的对象实例。

  3. 此最终级别是在 XAML 语言基元类型之间直接转换本身具有分析器的值、或检查枚举(分析器随后将访问匹配的值)中命名常量的名称。

枚举特性值

XAML 中的枚举由 XAML 分析器进行内部处理,而枚举的成员则应该通过指定枚举的某个命名常量的字符串名称进行指定。

的特性,它将无法正确解析。

Trigger

<!--This will not compile, because Visibility is not a flagwise enumeration.-->
...
<Trigger Property="Visibility" Value="Collapsed,Hidden">
  <Setter ... />
</Trigger>
...

 

此转换支持用更传统的语法表示 Microsoft Windows 编程中的组合键(如“Ctrl+Alt”)。

属性引用和事件成员名称引用

指定特性时,可以引用作为您为包含对象元素实例化的 CLR 类型的成员而存在的任何属性或事件。

(后面的某节即将讨论附加属性。)

路由事件概述

样式设置和模板化

PropertyPath XAML 语法

 属性元素语法

属性名称”形式的属性,在其中指定属性的值,然后结束属性元素。

属性名称 组合,并与其他元素标记对形成正确的嵌套和平衡。

ContextMenu 属性。

<Button>
  <Button.ContextMenu>
    <ContextMenu>
      <MenuItem Header="1">First item</MenuItem>
      <MenuItem Header="2">Second item</MenuItem>
    </ContextMenu>
  </Button.ContextMenu>
  Right-click me!</Button>

x:Uid 指令可应用于属性元素,并因此将其中的值标记为应在 WPF 输出 BAML 中本地化或通过其他技术本地化的值。

WPF 中的树。)

对于同时支持特性语法和属性元素语法的属性,尽管这两种语法的细微之处(如空白处理)略有不同,但它们的结果通常是一样的。

 集合语法

.NET 中的常规 XAML 处理器实现基于托管代码和 CLR,并且该处理器实现通过以下各项之一标识集合类型:

  • IList

  • IDictionary

  • x:Array 标记扩展)。

TriggerCollection 的项类型。

<Style x:Key="SpecialButton" TargetType="{x:Type Button}">
  <Style.Triggers>
    <Trigger Property="Button.IsMouseOver" Value="true">
      <Setter Property = "Background" Value="Red"/>
    </Trigger>
    <Trigger Property="Button.IsPressed" Value="true">
      <Setter Property = "Foreground" Value="Green"/>
    </Trigger>
  </Style.Triggers>
</Style>

 

 

属性可以既是一个集合类型,又是该类型和派生类型的 XAML 内容属性,本主题的下一节将讨论这种情况。

通常,父类型的构造函数对作为其属性之一的集合执行实例化,然后最初为空的集合将成为对象树的一部分。

XAML 语法详述注意

IDictionary)。

在集合类型的 .NET 参考页中,这种特意省略集合的对象元素的语法在 XAML 语法部分中有时称为“隐式集合语法”。

Load)的行为中得到加强。

GradientStopCollection) 的对象元素的语法。

<LinearGradientBrush>
  <LinearGradientBrush.GradientStops>
    <GradientStopCollection>
      <GradientStop Offset="0.0" Color="Red" />
      <GradientStop Offset="1.0" Color="Blue" />
    </GradientStopCollection>
  </LinearGradientBrush.GradientStops>
</LinearGradientBrush>

TriggerCollection 没有默认构造函数。

 XAML 内容属性

对于元素上其他属性的属性元素标记,并不按严格的 XAML 语言定义将其指派为“内容”;这些标记以前是按 XAML 分析器的处理顺序进行处理的,并不将其视为“内容”。

XAML 内容属性值必须连续

例如,无法分析以下标记:

<Button>I am a 
  <Button.Background>Blue</Button.Background>
  blue button</Button>

这在本质上是非法的,因为如果此语法是通过使用内容属性的属性元素语法而变为显式的,则内容属性将设置两次:

<Button>
  <Button.Content>I am a </Button.Content>
  <Button.Background>Blue</Button.Background>
  <Button.Content> blue button</Button.Content>
</Button>

 

一个类似的非法示例是,如果内容属性是一个集合,则子元素是与属性元素交错的:

 

<StackPanel>
  <Button>This example</Button>
  <StackPanel.Resources>
    <SolidColorBrush x:Key="BlueBrush" Color="Blue"/>
  </StackPanel.Resources>
  <Button>... is illegal XAML</Button>
</StackPanel>

 内容属性和集合语法组合

UIElementCollection 类型)。

<Page
  
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
  
>
  <StackPanel>
    <Button>Button 1</Button>
    <Button>Button 2</Button>
    <Button>Button 3</Button>
  </StackPanel>
</Page>

 

UIElementCollection 唯一的用途就是作为隐式集合,因此它不公开公共的默认构造函数,因此不能实例化为对象元素。

在具有内容属性的对象中混合使用属性元素和对象元素

针对混合使用属性元素和内容的这一限制由 WPF XAML 处理器强制实施。

但是,一旦内容后面跟有属性元素,您就不能进一步引入任何内容,而只能添加属性元素。

然而,这仍然是使内部文本保持连续的不错的标记样式,原因是,如果属性元素与内部文本交错分布,则很难直观地检测标记中的大量空白。

custom 前缀。

WPF XAML 的 XAML 命名空间和命名空间映射

   标记扩展

该类后面可能会出现一个空格,该空格后面的每个字符都可以由所实现的扩展用作输入,直到遇到右大括号。

Style 类型,如下例所示:

<Button Style="{StaticResource MyStyle}">My button</Button>

Style 属性值。

WPF XAML 扩展

附加属性概述

二者有两个重要的差异:

  • 只有附加属性才要求特性语法中使用限定属性名。

  • 类型名 是用来定义附加属性的类,而不是包含对象元素。

事件名称”是事件名称。

下表显示了一个经过分解的典型 XAML 根元素,同时显示了根元素的具体特性:

<Page

根元素的开始对象元素

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

默认 (WPF) XAML 命名空间

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

XAML 语言 XAML 命名空间

x:Class="ExampleNamespace.ExampleCode"

分部类声明,它将标记连接到为分部类定义的任何代码隐藏

>

 

以下各节描述 XAML 处理器在技术上支持的 XAML 用法,但这些用法会产生冗长的内容或其他美观上的问题,当您开发包含 XAML 源的应用程序时,这些问题会对保持可读的 XAML 文件产生影响。

属性元素的可选用法

或者,属性元素的隐式用法有时可以避免使用在技术上具有功能,但在视觉上容易引起混淆(如在特性值中嵌套标记扩展)的标记。

typeName.memberName 全限定特性

Background 特性的三个引用是完全等效的:

<Button Background="Blue">Background</Button>
<Button Button.Background="Blue">Button.Background</Button>
<Button Control.Background="Blue">Control.Background</Button>

 

 

Button 的基类。

成员名 格式示例并不适用,因此显示为已注释掉:

<!--<Button Label.Background="Blue">Does not work</Button> -->

 

Label.Background 不是可用的附加属性,因此这个用法将失败。

baseTypeName.memberName 属性元素

例如,下面的语法适用:

<Button>Control.Background PE
  <Control.Background>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
      <GradientStop Color="Yellow" Offset="0.0" />
      <GradientStop Color="LimeGreen" Offset="1.0" />
    </LinearGradientBrush>
    </Control.Background>
</Button>

 

 

Control.Background 形式提供。

成员名称”在标记中不是良好的样式,应当避免使用这种形式。

相关文章: