什么是XAML?
XAML 是一种声明性标记语言。如同应用于 .NET Framework 编程模型一样,XAML 简化了为 .NET Framework 应用程序创建 UI 的过程。您可以在声明性 XAML 标记中创建可见的 UI 元素,然后使用代码隐藏文件(通过分部类定义与标记相连接)将 UI 定义与运行时逻辑相分离。XAML 直接以程序集中定义的一组特定后备类型表示对象的实例化。
下面的示例演示如何创建作为 UI 一部分的按钮。此示例的目的仅在于供您初步了解 XAML 是如何表示常用 UI 编程形式的(它不是一个完整的示例)。
<StackPanel>
<Button Content="Click Me"/>
</StackPanel>
XAML对象元素
对象元素 StackPanel 和 Button 各映射到一个类名,这些类由 WPF 定义并且是 WPF 程序集的一部分。指定对象元素标记时会创建一条 XAML 处理指令来创建一个新实例。每个实例都是在分析和加载 XAML 时通过调用基础类型的默认构造函数来创建的。
设置属性:
1.属性语法是最简单有效的属性设置语法,并且对于曾使用过标记语言的开发人员而言在使用中是最直观的语法。例如,以下标记将创建一个具有红色文本和蓝色背景的按钮,还将创建指定为 Content 的显示文本。
<Button Background="Blue" Foreground="Red" Content="This is a button"/>
2.属性元素语法.
<Button>
<Button.Background>
<SolidColorBrush Color="Blue"/>
</Button.Background>
<Button.Foreground>
<SolidColorBrush Color="Red"/>
</Button.Foreground>
<Button.Content>
This is a button
</Button.Content>
</Button>
3.内容语法
<TextBlock>Hello</TextBlock>
4.集合语法:XAML 语言包含一些优化,可以生成可读性更好的标记。其中的一项优化是:如果某个特定属性采用集合类型,则您在标记中声明为该属性的值内的子元素的项将成为集合的一部分。在这种情况下,子对象元素的集合是设置为集合属性的值。
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<!-- no explicit new GradientStopCollection, parser knows how to find or create -->
<GradientStop Offset="0.0" Color="Red" />
<GradientStop Offset="1.0" Color="Blue" />
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
作为 XAML 语言的规则,XAML 内容属性的值必须完全在该对象元素的其他任何属性元素之前或之后指定。例如,下面的标记无法进行编译:
复制
<Button>I am a
<Button.Background>Blue</Button.Background>
blue button</Button>
有少量 XAML 元素可直接将文本作为其内容来处理。若要实现此功能,必须满足以下条件之一:
类必须声明一个内容属性,并且该内容属性必须是可赋值给字符串的类型(该类型可以是 Object)。例如,任何 ContentControl都将 Content 用作其内容属性,并且其类型为 Object,这样就支持实际的 ContentControl(例如,Button)上的如下用法:<Button>Hello</Button>。类型必须声明一个类型转换器,该类型转换器将文本内容用作其初始化文本。例如,<Brush>Blue</Brush>。这种情况实际上并不常见。
类型必须为已知的 XAML 语言基元。
内容属性和集合语法组合
请看以下示例:
<StackPanel>
<Button>First Button</Button>
<Button>Second Button</Button>
</StackPanel>
此例中,每个Button都是StackPanel的一个子元素。这是一个简单直观的标记,其中出于两个不同的原因省略了两个标记。
省略的StackPanel.Children属性元素:
StackPanel 从 Panel 派生。Panel 将 Panel.Children 定义为其 XAML 内容属性。
省略的UIElementCollection对象元素:
Panel.Children 属性采用类型 UIElementCollection,该类型实现 IList。根据处理集合(例如 IList)的 XAML 规则,集合的元素标记可以省略。(在这种情况下,UIElementCollection 实际无法实例化,因为它没有公开默认构造函数,这就是 UIElementCollection 对象元素以注释形式出现的原因。)
<StackPanel>
<StackPanel.Children>
<!--<UIElementCollection>-->
<Button>First Button</Button>
<Button>Second Button</Button>
<!--</UIElementCollection>-->
</StackPanel.Children>
</StackPanel>
标记扩展是一个 XAML 语言概念。当用于提供特性语法的值时,大括号({ 和 })表示标记扩展用法。此用法指示 XAML 处理系统不要像通常那样将特性值视为一个文本字符串或者可转换为字符串的值。
<Border Style="{StaticResource PageBackground}">
...
</Border>