XAML 概述

XAML(可扩展应用程序标记语言)是用于在 WinUI 应用中定义 UI 的声明性标记语言。 您在 .xaml 文件中描述 UI 结构和属性,并在与之配对的代码隐藏文件中处理逻辑和事件。

什么是 XAML?

XAML 是一种基于 XML 的语言,用于创建对象并设置其属性。 在标记中声明 UI 元素(按钮、文本框、布局),并使用代码隐藏文件响应事件并在运行时操作这些元素。

由于 XAML 是一种基于文本的交换格式,因此设计人员和开发人员可以独立工作:设计人员在 XAML 中编写可视结构,开发人员在代码隐藏文件中编写逻辑,而且双方都可以在不互相阻塞的情况下进行迭代。

基本 XAML 语法

所有有效的 XAML 也是有效的 XML,但 XAML 在上面添加了自己的概念。 例如, 属性元素语法 允许将属性设置为嵌套的 XML 元素而不是属性字符串,即有效的 XML,但在 XAML 中具有额外的意义。

有关完整的语法详细信息,请参阅 XAML 语法指南

XAML 和 Visual Studio

Visual Studio 的 XAML 编辑器提供 IntelliSense、自动补全和可视化设计界面。 在编译之前,错误会以波浪线形式直接显示在行内。 无需记住每个语法规则 , 让 IDE 指导你。

XAML 命名空间

每个 XAML 文件在其根元素中声明命名空间。 典型的 WinUI 页面以两个开头:

<Page
    x:Class="Application1.BlankPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
>
  • 默认命名空间xmlns=):包含所有内置 WinUI 控件、文本、图形、数据绑定和样式类型。 你的大多数 XAML 都使用此命名空间,且不带前缀。
  • XAML 语言命名空间xmlns:x=): 映射到 x: 前缀,提供核心语言功能。

x:命名空间

Attribute Purpose
x:Key ResourceDictionary 中资源的唯一键
x:Class 将 XAML 文件关联到其代码隐藏类
x:Name 为元素分配运行时名称,以便后台代码可以引用该元素
x:Uid 标记用于本地化资源替换的元素
XAML 内部类型 将简单值(如 x:Boolean)表示为对象元素

映射自定义类型

若要在 XAML 中使用自己的类型或第三方库类型,请声明映射到代码命名空间的命名空间前缀:

xmlns:myTypes="using:myCompany.myTypes"

然后,使用前缀引用这些类型:

<myTypes:CustomButton/>

有关详细信息,包括 C++/CX 注意事项,请参阅 XAML 命名空间和命名空间映射

设计器和兼容性命名空间

你通常会在工具生成的 XAML 中看到 d: (设计器)和 mc: (标记兼容性)前缀。 这些支持设计时工具,可在运行时安全地忽略。 有关详细信息,请参阅 其他 XAML 命名空间

标记扩展

标记扩展允许将属性设置为不能表示为纯字符串的内容,例如对共享资源或数据绑定的引用。 它们使用大括号语法:

<Button Style="{StaticResource SearchButtonStyle}"/>

如果没有 {StaticResource},则需要使用冗长的属性元素语法来指定一个 Style。 标记扩展保持 XAML 简洁。

Windows 运行时 XAML 支持以下标记扩展:

Extension Purpose
{x:Bind} 编译时数据绑定(最佳性能)
{Binding} 运行时数据绑定
{StaticResource} 通过键引用 ResourceDictionary 条目
{ThemeResource} {StaticResource} 类似,但会在应用主题发生变化时更新
{TemplateBinding} 绑定到控件模板的父级属性
{RelativeSource} 相对于模板化父级绑定
{CustomResource} 高级自定义资源查找
{x:Null} 将可为 null 的值显式设置为 null

标记扩展可以嵌套;最内层的扩展会先求值。

事件

通过将事件指定为属性,并将处理程序方法名称指定为其值,从而在 XAML 中附加事件处理程序:

<Button Click="showUpdatesButton_Click">Show updates</Button>

编译器要求代码隐藏文件中存在一个具有正确的委托签名的匹配方法:

private void showUpdatesButton_Click(object sender, RoutedEventArgs e)
{
    // your code
}
void showUpdatesButton_Click(Windows::Foundation::IInspectable const&, Microsoft::UI::Xaml::RoutedEventArgs const&);

注释

在 C++/CX 中,每个 XAML 页面都有两个代码隐藏文件:标头(.xaml.h)和实现(.xaml.cpp)。

有关详细信息,请参阅 事件和路由事件概述

资源字典

ResourceDictionary 存储由 x:Key 标识的可重用对象(画笔、样式、模板)。 资源可以位于页面的资源部分或单独的 .xaml 文件中。 有关完整说明,请参阅 ResourceDictionary 和 XAML 资源引用

XAML 和 XML

XAML 是 XML 的超集,需要了解以下几点:

  • 区分大小写:元素和属性名称必须完全匹配。
  • xml:lang:在 XAML 中有效,但映射到框架级运行时行为,而不是分析行为。
  • 编码:仅支持 UTF-8 和 UTF-16。

XAML 名称范围

使用 x:Name 指定的名称在其 名称范围内必须是唯一的。 名称范围在控件模板中尤为重要,因为名称的作用域限定在模板内,而不是页面内。 有关详细信息,请参阅 XAML 名称范围

性能提示

  • 将常用画笔定义为 SolidColorBrush 资源,而不是重复颜色文本。
  • 将跨页面共享的资源放在 Application.Resources 中;将页面特定资源保留在该页面本地。
  • 在寄送之前删除未使用的资源(没有 {StaticResource} 引用的密钥)。
  • 避免重写控件模板 — 默认值已优化负载性能。
  • 使用 Border 和布局容器,而不是多次绘制相同的像素(过度绘制)。
  • ListViewGridView 使用默认项模板;它们的 Presenter 逻辑已针对大型列表进行了调优。

有关更多指南,请参阅 “优化 XAML 标记”。

调试 XAML

无法在 .xaml 文件中设置断点,但 Visual Studio 提供了其他帮助:

  • 设计时:键入时,波浪线和错误标记会内联显示。
  • 运行时:解析失败时会引发 XamlParseException(或在 C++/CX 中引发类似的结构化异常),其中包含 XAML 文件的行号上下文。

有关运行时错误处理,请参阅 C# 或 Visual Basic 中 WinUI 应用的异常处理。 若要启动调试会话,请参阅 “启动调试会话”。