XAML 名前空間

XAML では、名前空間宣言に xmlns XML 属性が使用されます。 通常、XAML ファイルのルート要素内に表示される 2 つの標準 XAML 名前空間宣言があります。 1 つ目は、既定の名前空間を定義します。

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

既定の名前空間は、プレフィックスのない XAML ファイル内で定義された要素が、ContentPageLabelButton などの.NETマルチプラットフォーム アプリ UI (.NET MAUI) クラスを参照することを指定します。

2 番目の名前空間宣言では、 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:Arguments属性とx:FactoryMethod属性の詳細については、「引数を渡す」を参照してください。 x:TypeArguments属性の詳細については、「ジェネリック」を参照してください。

上記のコンストラクトに加えて、.NET MAUIには、x 名前空間プレフィックスを介して使用できるマークアップ拡張も含まれています。 詳細については、「 XAML マークアップ拡張機能の使用」を参照してください。

XAML では、名前空間宣言は親要素から子要素に継承されます。 したがって、XAML ファイルのルート要素で名前空間を定義する場合、そのファイル内のすべての要素は名前空間宣言を継承します。

暗黙的な名前空間宣言

.NET 11 以降では、暗黙的な XAML 名前空間宣言が既定で有効になっています。 コンパイラによって 2 つの標準名前空間宣言が自動的に挿入されるため、XAML ファイルのルート要素に含める必要がなくなりました。

  • xmlns="http://schemas.microsoft.com/dotnet/2021/maui" — 既定の.NET MAUI名前空間。
  • xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"x:Classx:Name、およびその他の組み込みコンストラクトを提供する XAML 言語名前空間。

これは、以前は明示的な名前空間宣言が必要だったコンテンツ ページを意味します。

<!-- .NET 10 and earlier: explicit namespace declarations required -->
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MyApp.MainPage">
    <Label Text="Hello, World!" />
</ContentPage>

次のコードを使用せずに記述できるようになりました。

<!-- .NET 11: standard namespaces are implicit -->
<ContentPage x:Class="MyApp.MainPage">
    <Label Text="Hello, World!" />
</ContentPage>

明示的な宣言を含む既存の XAML ファイルは、変更なしでコンパイルを続けます。 明示的な宣言を使用して、必要に応じて重複する型名を明確にすることもできます。

Important

カスタム名前空間には、引き続き明示的な xmlns: 宣言が必要です。 既定の.NET MAUI名前空間と x: XAML 言語名前空間のみが暗黙的に使用できます。

たとえば、独自の CLR 名前空間またはサード パーティ製ライブラリのプレフィックスを宣言する必要があります。

<ContentPage x:Class="MyApp.MainPage"
             xmlns:local="clr-namespace:MyApp.Controls"
             xmlns:toolkit="http://schemas.microsoft.com/dotnet/2022/maui/toolkit">
    <local:CustomControl />
</ContentPage>

.NET 10 では、暗黙的な名前空間宣言をプレビュー機能として使用できます。 オプトインするには、プロジェクト ファイルに次のコードを追加します。

<PropertyGroup>
    <DefineConstants>$(DefineConstants);MauiAllowImplicitXmlnsDeclaration</DefineConstants>
    <EnablePreviewFeatures>true</EnablePreviewFeatures>
</PropertyGroup>

有効にすると、XAML ファイルから標準の xmlnsxmlns:x 宣言を省略できます。 カスタム名前空間には、引き続き明示的な xmlns: 宣言が必要です。

型の名前空間を宣言する

XAML で型を参照するには、プレフィックスを持つ XAML 名前空間を宣言し、名前空間宣言で共通言語ランタイム (CLR) 名前空間名を指定し、必要に応じてアセンブリ名を指定します。 これは、名前空間宣言内で次のキーワードの値を定義することによって実現されます。

  • clr-namespace: または using: – XAML 要素として公開する型を含むアセンブリ内で宣言された CLR 名前空間。 このキーワードは必須です。
  • assembly= – 参照先の CLR 名前空間を含むアセンブリ。 この値は、ファイル拡張子のないアセンブリの名前です。 アセンブリへのパスは、アセンブリを参照する XAML ファイルを含むプロジェクト内の参照として確立する必要があります。 clr-namespace 値が型を参照しているアプリ コードと同じアセンブリ内にある場合は、このキーワードを省略できます。

clr-namespaceまたはusing トークンを値から分離する文字はコロンですが、assembly トークンを値から分離する文字は等号です。 2 つのトークンの間で使用する文字はセミコロンです。

次のコード例は、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>

カスタム名前空間スキーマの定義については、「 カスタム名前空間スキーマ」を参照してください。