次の方法で共有


カスタム名前空間スキーマ

.NET マルチプラットフォーム アプリ UI (.NET MAUI) ライブラリの型を XAML で参照するには、名前空間宣言で共通言語ランタイム (CLR) 名前空間名とアセンブリ名を指定し、当該ライブラリの XAML 名前空間を宣言します。

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

ただし、定義で CLR 名前空間とアセンブリ名を xmlns の定義で指定するのは難しく、エラーが発生しやすくなります。 さらに、ライブラリに複数の名前空間の型が含まれている場合は、複数の XML 名前空間宣言が必要になる可能性があります。

別の方法として、1 つ以上の CLR 名前空間にマップされるカスタム名前空間スキーマ (たとえば http://mycompany.com/schemas/controls) を定義できます。 これにより、1 つの XML 名前空間宣言で、異なる名前空間内にある場合でも、アセンブリ内のすべての型を参照できます。 また、1 つの XML 名前空間宣言で複数のアセンブリ内の型を参照することもできます。

XAML 名前空間の詳細については、「XAML 名前空間」を参照してください。

カスタム名前空間スキーマを定義する

次のような CircleButtonいくつかの単純なコントロールを公開するライブラリを想像してみてください。

namespace MyCompany.Controls
{
    public class CircleButton : Button
    {
        ...
    }
}

ライブラリ内のコントロールはすべて、MyCompany.Controls 名前空間にあります。 これらのコントロールは、カスタム名前空間スキーマを使用して呼び出しアセンブリに公開できます。

カスタム名前空間スキーマは、XAML 名前空間と 1 つ以上の CLR 名前空間の間のマッピングを指定する XmlnsDefinitionAttribute クラスを使用して定義されます。 XmlnsDefinitionAttribute は、XAML 名前空間名と CLR 名前空間名の 2 つの引数を受け取ります。 XAML 名前空間名は XmlnsDefinitionAttribute.XmlNamespace プロパティに格納され、CLR 名前空間名は XmlnsDefinitionAttribute.ClrNamespace プロパティに格納されます。

XmlnsDefinitionAttribute クラスには、必要に応じてアセンブリの名前に設定できる、AssemblyName という名前のプロパティもあります。 これは、XmlnsDefinitionAttribute から参照される CLR 名前空間が外部アセンブリにある場合にのみ必要です。

カスタム XmlnsDefinitionAttribute 名前空間スキーマにマップされる CLR 名前空間を含むプロジェクトのアセンブリ レベルで定義する必要があります。

using MyCompany.Controls;

[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]

このコードは、http://mycompany.com/schemas/controls URL を MyCompany.Controls CLR 名前空間にマッピングするカスタム名前空間スキーマを作成します。

重要

カスタム名前空間スキーマを介してマップされたアセンブリ内の型を保持するか、アセンブリ全体を保持するようにリンカーに指示する必要があります。 詳細については、「コードを保持する」を参照してください

その後、カスタム名前空間スキーマを XAML ファイルの型の解決に使用できます。

カスタム名前空間スキーマを使用する

カスタム名前空間スキーマから型を使用するには、XAML コンパイラでは、型を使用するアセンブリから、型を定義するアセンブリへのコード参照が必要です。 これを実現するには、XAML で使用される型を定義するアセンブリに Init メソッドを含むクラスを追加します。

namespace MyCompany.Controls
{
    public static class Controls
    {
        public static void Init()
        {
        }
    }
}

その後は、カスタム名前空間スキーマから型を使用するアセンブリからInit メソッドを呼び出すことができます。

using MyCompany.Controls;

namespace CustomNamespaceSchemaDemo
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            Controls.Init();
            InitializeComponent();
        }
    }
}

警告

このようなコード参照を含めないと、XAML コンパイラはカスタム名前空間スキーマ型を含むアセンブリを見つけられません。

CircleButton コントロールを使用するために、XAML 名前空間が宣言され、名前空間宣言でカスタム名前空間スキーマ URL が指定されます。

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:controls="http://mycompany.com/schemas/controls"
             x:Class="CustomNamespaceSchemaDemo.MainPage">
    <StackLayout>
        ...
        <controls:CircleButton Text="+"
                               BackgroundColor="Fuchsia"
                               BorderColor="Black"
                               CircleDiameter="100" />
        <controls:CircleButton Text="-"
                               BackgroundColor="Teal"
                               BorderColor="Silver"
                               CircleDiameter="70" />
        ...
    </StackLayout>
</ContentPage>

その後、controls名前空間プレフィックスで宣言することで、CircleButtonインスタンスを ContentPage に追加できます。

カスタム名前空間スキーマ型を検索するため、.NET MAUI は XmlnsDefinitionAttribute インスタンスの参照アセンブリを検索します。 XAML ファイル内の要素の xmlns 属性がXmlnsDefinitionAttributeXmlNamespace プロパティ値と一致する場合、.NET MAUI は型の解決に XmlnsDefinitionAttribute.ClrNamespace プロパティ値を使用しようとします。 型の解決に失敗した場合、.NET MAUI は、一致する追加の XmlnsDefinitionAttribute インスタンスに基づいて、引き続き型の解決を試みます。

その結果、2 つの CircleButton インスタンスが表示されます。

Screenshot of two circle buttons.