XAML での引数の受け渡し

Download Sampleサンプルのダウンロード

この記事では、既定以外のコンストラクターに引数を渡したり、ファクトリ メソッドを呼び出したり、ジェネリック引数の型を指定したりするために使用できる XAML 属性を使用する方法について説明します。

概要

多くの場合、引数を必要とするコンストラクターを使用するか、静的作成メソッドを呼び出してオブジェクトをインスタンス化する必要があります。 これは、XAML で x:Arguments 属性と x:FactoryMethod 属性を使用して実現できます。

  • x:Arguments 属性は、既定以外のコンストラクターまたはファクトリ メソッド オブジェクト宣言のコンストラクター引数を指定するために使用されます。 詳細については、「コンストラクター引数を渡す」を参照してください。
  • x:FactoryMethod 属性は、オブジェクトの初期化に使用できるファクトリ メソッドを指定するために使用されます。 詳細については、「ファクトリ メソッドの呼び出し」を参照してください。

さらに、x:TypeArguments 属性を使用して、ジェネリック型のコンストラクターにジェネリック型引数を指定できます。 詳細については、「ジェネリック型引数の指定」を参照してください。

コンストラクター引数を渡す

引数は、x:Arguments 属性を使用して既定以外のコンストラクターに渡すことができます。 各コンストラクター引数は、引数の型を表す XML 要素内で区切る必要があります。 Xamarin.Forms では、基本型に対して次の要素がサポートされています。

  • x:Array
  • x:Boolean
  • x:Byte
  • x:Char
  • x:DateTime
  • x:Decimal
  • x:Double
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Object
  • x:Single
  • x:String
  • x:TimeSpan

次のコード例では、3 つの Color コンストラクターで x:Arguments 属性を使用する方法を示します。

<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color>
      <x:Arguments>
        <x:Double>0.9</x:Double>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color>
      <x:Arguments>
        <x:Double>0.25</x:Double>
        <x:Double>0.5</x:Double>
        <x:Double>0.75</x:Double>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color>
      <x:Arguments>
        <x:Double>0.8</x:Double>
        <x:Double>0.5</x:Double>
        <x:Double>0.2</x:Double>
        <x:Double>0.5</x:Double>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>

x:Arguments タグ内の要素の数とこれらの要素の型は、Color コンストラクターのいずれかと一致する必要があります。 パラメーターが 1 つの Color コンストラクターには、0 (黒) から 1 (白) までのグレースケール 値が必要です。 3 つのパラメーターを持つ Colorコンストラクターには、0 - 1 の範囲の赤、緑、青の値が必要です。 4 つのパラメーターを持つ Colorコンストラクターは、4 番目のパラメーターとしてアルファ チャネルを追加します。

次のスクリーンショットは、指定した引数値を使用して各 Color コンストラクターを呼び出した結果を示しています。

BoxView.Color specified with x:Arguments

ファクトリ メソッドの呼び出し

ファクトリ メソッドは、x:FactoryMethod 属性を使用してメソッドの名前を指定し、x:Arguments 属性を使用してその引数を指定することで、XAML 内で呼び出すことができます。 ファクトリ メソッドは、定義するクラスまたは構造と同じ型のオブジェクトまたは値を返す public static メソッドです。

Color 構造体は、いくつかのファクトリ メソッドを定義します。次のコード例は、そのうちの 3 つを呼び出す例を示しています。

<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromRgba">
      <x:Arguments>
        <x:Int32>192</x:Int32>
        <x:Int32>75</x:Int32>
        <x:Int32>150</x:Int32>                        
        <x:Int32>128</x:Int32>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromHsla">
      <x:Arguments>
        <x:Double>0.23</x:Double>
        <x:Double>0.42</x:Double>
        <x:Double>0.69</x:Double>
        <x:Double>0.7</x:Double>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>
<BoxView HeightRequest="150" WidthRequest="150" HorizontalOptions="Center">
  <BoxView.Color>
    <Color x:FactoryMethod="FromHex">
      <x:Arguments>
        <x:String>#FF048B9A</x:String>
      </x:Arguments>
    </Color>
  </BoxView.Color>
</BoxView>

x:Arguments タグ内の要素の数とこれらの要素の型は、呼び出されるファクトリ メソッドの引数と一致する必要があります。 FromRgba ファクトリ メソッドには、それぞれ 0 - 255 の範囲の赤、緑、青、アルファの値を表す 4 つの Int32 パラメーターが必要です。 FromHsla ファクトリ メソッドには、それぞれ 0 から 1 の範囲の色相、彩度、明度、アルファの値を表す 4 つの Double パラメーターが必要です。 FromHex ファクトリ メソッドには、16 進数 (A)RGB 色を表す String が必要です。

次のスクリーンショットは、指定した引数値を使用して各 Color ファクトリ メソッドを呼び出した結果を示しています。

BoxView.Color specified with x:FactoryMethod and x:Arguments

ジェネリック型引数の指定

次のコード例に示すように、ジェネリック型のコンストラクターのジェネリック型引数は、x:TypeArguments 属性を使用して指定できます。

<ContentPage ...>
  <StackLayout>
    <StackLayout.Margin>
      <OnPlatform x:TypeArguments="Thickness">
        <On Platform="iOS" Value="0,20,0,0" />
        <On Platform="Android" Value="5, 10" />
        <On Platform="UWP" Value="10" />
      </OnPlatform>
    </StackLayout.Margin>
  </StackLayout>
</ContentPage>

OnPlatform クラスはジェネリック クラスであり、対象の型と一致する x:TypeArguments 属性を使用してインスタンス化する必要があります。 On クラスで、Platform 属性は 1 つのstring値または複数のコンマ区切りstring 値を受け取ることができます。 この例では、StackLayout.Margin プロパティはプラットフォーム固有 Thickness に設定されています。

ジェネリック型引数の詳細については、「Xamarin.Forms XAML のジェネリック」を参照してください。