XAML 命名空间

XAML 使用 xmlns XML 特性进行命名空间声明。 XAML 文件的根元素中始终有两个 XAML 命名空间声明。 第一个定义默认命名空间:

xmlns="http://schemas.microsoft.com/dotnet/2021/maui"

默认命名空间指定 XAML 文件中定义的不带前缀的元素引用 .NET Multi-platform App UI (.NET MAUI) 类,例如 ContentPageLabelButton

第二个命名空间声明使用 x 前缀:

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

XAML 使用前缀声明非默认命名空间,并在引用命名空间中的类型时使用前缀。 x 命名空间声明指定在 XAML 中定义的带有 x 前缀的元素用于 XAML(特别是 2009 XAML 规范)固有的元素和属性。

下表概述了 .NET MAUI 支持的 x 构造:

构造 描述
x:Arguments 指定非默认构造函数或工厂方法对象声明的构造函数参数。
x:Class 指定 XAML 中定义的类的命名空间和类名。 类名必须与代码隐藏文件的类名匹配。 请注意,此构造只能出现在 XAML 文件的根元素中。
x:ClassModifier 指定程序集中生成的类的访问级别。
x:DataType 指定 XAML 元素及其子元素将绑定到的对象的类型。
x:FactoryMethod 指定可用于初始化对象的工厂方法。
x:FieldModifier 指定命名 XAML 元素的生成字段的访问级别。
x:Key ResourceDictionary 中的每个资源指定一个唯一的用户定义密钥。 密钥的值用于检索 XAML 资源,通常用作 StaticResource 标记扩展的参数。
x:Name 指定 XAML 元素的运行时对象名称。 设置 x:Name 类似于在代码中声明变量。
x:TypeArguments 指定泛型类型构造函数的泛型类型参数。

有关 x:ClassModifier 属性的详细信息,请参阅类修饰符。 有关 x:DataType 属性的详细信息,请参阅编译的绑定。 有关 x:FieldModifier 属性的详细信息,请参阅字段修饰符。 有关 x:Argumentsx:FactoryMethod 属性的详细信息,请参阅传递参数。 有关 x:TypeArguments 属性的详细信息,请参阅泛型

注意

除了上面列出的构造之外,.NET MAUI 还包括可通过 x 命名空间前缀使用的标记扩展。 有关详细信息,请参阅使用 XAML 标记扩展

在 XAML 中,命名空间声明从父元素继承到子元素。 因此,在 XAML 文件的根元素中定义命名空间时,该文件中的所有元素都会继承命名空间声明。

声明类型的命名空间

可以通过使用前缀声明 XAML 命名空间,在 XAML 中引用类型,命名空间声明指定公共语言运行时 (CLR) 命名空间名称以及可选的程序集名称。 这通过在命名空间声明中定义以下关键字的值来实现:

  • clr-namespace:using: - 在程序集中声明的 CLR 命名空间,此程序集包含要作为 XAML 元素公开的类型。 此关键字是必需的。
  • assembly= - 包含引用的 CLR 命名空间的程序集。 该值是程序集的名称,不带文件扩展名。 程序集的路径应在包含将引用程序集的 XAML 文件的项目中作为引用建立。 如果 clr-namespace 值与引用类型的应用代码位于同一程序集中,则可以省略此关键字

注意

分隔 clr-namespaceusing 标记与其值的字符是冒号,而分隔 assembly 标记与其值的字符是等于号。 这两个标记之间应使用的字符是分号。

以下代码示例演示 XAML 命名空间声明:

<ContentPage ... xmlns:local="clr-namespace:MyMauiApp">
  ...
</ContentPage>

或者,也可以编写为:

<ContentPage ... xmlns:local="using:MyMauiApp">
  ...
</ContentPage>

local 前缀是一种约定,用于表示命名空间中的类型是应用的本地类型。 或者,如果类型位于另外的程序集中,则还应在命名空间声明中定义程序集名称:

<ContentPage ... xmlns:controls="clr-namespace:Controls;assembly=MyControlLibrary" ...>
  ...
</ContentPage>

然后,从导入的命名空间声明类型的实例时指定命名空间前缀:

<controls:Expander IsExpanded="True">
    ...
</controls:Expander>

有关定义自定义命名空间架构的信息,请参阅自定义命名空间架构