Xamarin.Forms のXAML カスタム名前空間スキーマ
ライブラリ内の型は、名前空間の宣言で共通言語ランタイム (CLR) 名前空間の名前とアセンブリ名を指定する名前空間宣言を使用して、そのライブラリの XAML 名前空間を宣言することで、XAML で参照できます。
<ContentPage ...
xmlns:controls="clr-namespace:MyCompany.Controls;assembly=MyCompany.Controls">
...
</ContentPage>
ただし、定義で CLR 名前空間とアセンブリ名を xmlns
の定義で指定するのは難しく、エラーが発生しやすくなります。 さらに、ライブラリに複数の名前空間の型が含まれている場合は、複数の XAML 名前空間宣言が必要になることがあります。
別の方法として、1 つ以上の CLR 名前空間にマップされるカスタム名前空間スキーマ (たとえば http://mycompany.com/schemas/controls
) を定義できます。 これにより、異なる名前空間内にある場合でも、1 つの XAML 名前空間宣言でアセンブリ内のすべての型を参照できます。 また、1 つの XAML 名前空間宣言で複数のアセンブリ内の型を参照できます。
XAML 名前空間の詳細については、「Xamarin.Forms の XAML 名前空間」を参照してください。
カスタム名前空間スキーマの定義
サンプル アプリケーションには、CircleButton
のような単純なコントロールを公開するライブラリが含まれています。
using Xamarin.Forms;
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 名前空間を含むプロジェクトのアセンブリ レベルで定義する必要があります。 次の例は、サンプル アプリケーションからの AssemblyInfo.cs ファイルを示します。
using Xamarin.Forms;
using MyCompany.Controls;
[assembly: Preserve]
[assembly: XmlnsDefinition("http://mycompany.com/schemas/controls", "MyCompany.Controls")]
このコードは、http://mycompany.com/schemas/controls
URL を MyCompany.Controls
CLR 名前空間にマッピングするカスタム名前空間スキーマを作成します。 さらに、リンカーがアセンブリ内のすべての型を保持するようにアセンブリで Preserve
属性を指定します。
重要
Preserve
属性は、カスタム名前空間スキーマを介してマッピングされるアセンブリ内のクラスに適用するか、アセンブリ全体に適用する必要があります。
その後、カスタム名前空間スキーマを XAML ファイルの型の解決に使用できます。
カスタム名前空間スキーマの使用
カスタム名前空間スキーマから型を使用するには、XAML コンパイラでは、型を使用するアセンブリから、型を定義するアセンブリへのコード参照が必要です。 これを実現するには、XAML で使用される型を定義するアセンブリに Init
メソッドを含むクラスを追加します。
namespace MyCompany.Controls
{
public static class Controls
{
public static void Init()
{
}
}
}
その後は、カスタム名前空間スキーマから型を使用するアセンブリからInit
メソッドを呼び出すことができます。
using Xamarin.Forms;
using MyCompany.Controls;
namespace CustomNamespaceSchemaDemo
{
public partial class MainPage : ContentPage
{
public MainPage()
{
Controls.Init();
InitializeComponent();
}
}
}
警告
このようなコード参照を含めないと、XAML コンパイラはカスタム名前空間スキーマ型を含むアセンブリを見つけられません。
CircleButton
コントロールを使用するために、XAML 名前空間が宣言され、名前空間宣言でカスタム名前空間スキーマ URL が指定されます。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:controls="http://mycompany.com/schemas/controls"
x:Class="CustomNamespaceSchemaDemo.MainPage">
<StackLayout Margin="20,35,20,20">
...
<controls:CircleButton Text="+"
BackgroundColor="Fuchsia"
BorderColor="Black"
CircleDiameter="100" />
<controls:CircleButton Text="-"
BackgroundColor="Teal"
BorderColor="Silver"
CircleDiameter="70" />
...
</StackLayout>
</ContentPage>
その後、controls
名前空間プレフィックスで宣言することで、CircleButton
インスタンスを ContentPage
に追加できます。
カスタム名前空間スキーマの型を見つけるために、Xamarin.Forms によって参照アセンブリで XmlnsDefinitionAttribute
インスタンスの検索が行われます。 XAML ファイル内の要素の xmlns
属性が XmlnsDefinitionAttribute
の XmlNamespace
プロパティ値と一致する場合、Xamarin.Forms では XmlnsDefinitionAttribute.ClrNamespace
プロパティ値を使用して型の解決を試みます。 型の解決に失敗した場合、Xamarin.Forms では他の一致する追加の XmlnsDefinitionAttribute
インスタンスに基づいて、引き続き型の解決を試みます。
その結果、2 つの CircleButton
インスタンスが表示されます。