WPF-XAML知识点

359 阅读3分钟

1.什么是XAML

XAML 是一种声明性标记语言。。 应用于 .NET Core 编程模型时,XAML 简化了为 .NET Core 应用创建 UI 的过程。 你可以在声明性 XAML 标记中创建可见的 UI 元素,然后使用代码隐藏文件(这些文件通过分部类定义与标记相联接)将 UI 定义与运行时逻辑相分离。

2.XAML对象元素

XAML中的每个标签都是一个对象元素

<StackPanel>
    <Button Content="Click Me"/>
</StackPanel>

这指定了两个对象元素:<StackPanel>(含有内容,后面有一个结束标记)和 <Button .../>(自结束形式,包含几个特性)。 对象元素 StackPanel 和 Button 各映射到一个类名,该类由 WPF 定义并且属于 WPF 程序集。

3.XAML对象属性

对象的属性通常可表示为对象元素的特性。 特性语法对设置的对象属性命名,后跟赋值运算符 (=)。

<Button Background="Blue" Foreground="Red" Content="This is a button"/>

对于对象元素的某些属性,无法使用特性语法,因为无法在特性语法的引号和字符串限制内充分地表达提供属性值所必需的对象或信息。 对于这些情况,可以使用另一个语法,即属性元素语法

下面使用属性元素语法设置Button属性

<Button>
    <Button.Background>
        <SolidColorBrush Color="Blue"/>
    </Button.Background>
    <Button.Foreground>
        <SolidColorBrush Color="Red"/>
    </Button.Foreground>
    <Button.Content>
        This is a button
    </Button.Content>
</Button>

4.XAML内容属性

XAML 指定了一个语言功能,通过该功能,类可以指定它的一个且仅一个属性为 XAML 内容属性。 该对象元素的子元素用于设置该内容属性的值。 换言之,仅对内容属性而言,可以在 XAML 标记中设置该属性时省略属性元素,并在标记中生成更直观的父级/子级形式。

例如,Border指定 Child 的内容 属性。 以下两个 Border元素的处理方式相同。 第一个元素利用内容属性语法并省略 Border.Child 属性元素。 第二个元素显式显示 Border.Child

<Border>
    <TextBox Width="300"/>
</Border>
<!--explicit equivalent-->
<Border>
    <Border.Child>
        <TextBox Width="300"/>
    </Border.Child>
</Border>

5.根元素和命名空间

<Page x:Class="index.Page1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="Page1">

</Page>

一个 XAML 文件只能有一个根元素

根元素还包含特性 xmlns 和 xmlns:x。 这些特性向 XAML 处理器指示哪些 XAML 命名空间包含标记将其作为元素引用的后备类型的类型定义。

6.x: 前缀

在之前的根元素示例中,前缀 x: 用于映射 XAML 命名空间

  • x:Key:为 ResourceDictionary(或其他框架中的类似字典概念)中的每个资源设置唯一的键。 在典型的 WPF 应用标记中的所有 x: 用法中,x:Key 可能占到 90%。

  • x:Class:向为 XAML 页提供代码隐藏的类指定 CLR 命名空间和类名。 必须具有这样一个类才能支持每个 WPF 编程模型的代码隐藏,因此即使没有资源,也几乎总是能看到映射的 x:

  • x:Name:处理对象元素后,为运行时代码中存在的实例指定运行时对象名称。 通常,经常为 x:Name 使用 WPF 定义的等效属性。 此类属性特定映射到 CLR 后备属性,因此更便于进行应用编程,在应用编程中,经常使用运行时代码从初始化的 XAML 中查找命名元素。 最常见的此类属性是 FrameworkElement.Name。 在特定类型中不支持等效的 WPF 框架级 Name 属性时,仍然可以使用 x:Name。 某些动画方案中会发生这种情况。

  • x:Static:启用一个返回静态值的引用,该静态值不是与 XAML 兼容的属性。

  • x:Type:根据类型名称构造 Type 引用。 用于指定采用 Type(例如 Style.TargetType)的特性,但属性经常具有本机的字符串到 Type 的转换功能,因此使用 x:Type 标记扩展用法是可选的。