Paso de argumentos en XAML

En este artículo se muestra cómo usar los atributos XAML que se pueden usar para pasar argumentos a constructores no predeterminados, llamar a Factory Methods y especificar el tipo de un argumento genérico.

Información general

A menudo es necesario crear instancias de objetos con constructores que requieran argumentos o llamar a un método de creación estático. Esto se puede lograr en XAML mediante los atributos x:Arguments y x:FactoryMethod:

  • El atributo x:Arguments se usa para especificar argumentos de constructor para un constructor no predeterminado o para una declaración de objeto de método de fábrica. Para obtener más información, vea Pasar argumentos de constructor.
  • El atributo x:FactoryMethod se usa para especificar un método de fábrica que se puede usar para inicializar un objeto. Para obtener más información, vea Llamar a Factory Methods.

Además, el atributo x:TypeArguments puede usarse para especificar los argumentos de tipo genérico para el constructor de un tipo genérico. Para obtener más información, vea Especificar un argumento de tipo genérico.

Paso de argumentos de constructor

Los argumentos se pueden pasar a un constructor no predeterminado con el atributo x:Arguments. Cada argumento de constructor debe delimitarse dentro de un elemento XML que represente el tipo del argumento. Xamarin.Forms admite los siguientes elementos para los tipos básicos:

  • 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

En el ejemplo de código siguiente se muestra el uso del atributo x:Arguments con tres constructores Color:

<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>

El número de elementos de la etiqueta x:Arguments y sus tipos deben coincidir con uno de los constructores Color. El Color constructor con un único parámetro requiere un valor de escala de grises de 0 (negro) a 1 (blanco). El Color constructor con tres parámetros requiere un valor rojo, verde y azul comprendido entre 0 y 1. El Color constructor con cuatro parámetros agrega un canal alfa como cuarto parámetro.

Las capturas de pantalla siguientes muestran el resultado de llamar a cada constructor Color con los valores de argumento especificados:

BoxView.Color especificado con x:Arguments

Llamar a Factory Methods

Los Factory Methods se pueden llamar en XAML especificando el nombre del método mediante el atributo x:FactoryMethod y sus argumentos mediante el atributo x:Arguments. Un método de fábrica es un método public static que devuelve objetos o valores del mismo tipo que la clase o estructura que define los métodos.

La estructura Color define una serie de Factory Methods y en el ejemplo de código siguiente se muestra cómo llamar a tres de ellos:

<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>

El número de elementos dentro de la etiqueta x:Arguments y los tipos de estos elementos deben coincidir con los argumentos del método de fábrica al que se llama. El Factory Method FromRgba requiere cuatro parámetros Int32, que representan los valores rojo, verde, azul y alfa, que van de 0 a 255 respectivamente. El Factory Method FromHsla requiere cuatro parámetros Double, que representan el tono, la saturación, la luminosidad y los valores alfa, que van de 0 a 1 respectivamente. El Factory Method FromHex requiere un String que representa el color hexadecimal (A)RGB.

En las capturas de pantalla siguientes se muestra el resultado de llamar a cada Factory Method Color con los valores de argumento especificados:

BoxView.Color especificado con x:FactoryMethod y x:Arguments

Especificar un argumento de tipo genérico

Los argumentos de tipo genérico para el constructor de un tipo genérico se pueden especificar mediante el atributo x:TypeArguments, como se muestra en el ejemplo de código siguiente:

<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>

La clase OnPlatform es una clase genérica y se debe crear una instancia de ella con un atributo x:TypeArguments que coincida con el tipo de destino. En la clase On, el atributo Platform puede aceptar un valor string único o varios valores string delimitados por comas. En este ejemplo, la propiedad StackLayout.Margin se establece en un valor Thickness específico de la plataforma.

Para obtener más información sobre los argumentos de tipo genéricos, consulte Genéricos en Xamarin.Forms XAML.