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 métodos de generador y especificar el tipo de argumento genérico.
Introducción
A menudo es necesario crear instancias de objetos con constructores que requieren argumentos o mediante una llamada a un método de creación estático. Esto se puede lograr en XAML mediante los x:Arguments atributos x:FactoryMethod y :
- El atributo se usa para especificar argumentos de constructor para un constructor no predeterminado o para una declaración de objeto
x:Argumentsde método de generador. Para obtener más información, vea Pasar argumentos de constructor. - El
x:FactoryMethodatributo se usa para especificar un método de generador que se puede usar para inicializar un objeto. Para obtener más información, vea Llamar a métodos de generador.
Además, el atributo se puede usar para especificar los argumentos de x:TypeArguments 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.
Pasar argumentos de constructor
Los argumentos se pueden pasar a un constructor no predeterminado mediante el x:Arguments atributo . 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:Arrayx:Booleanx:Bytex:Charx:DateTimex:Decimalx:Doublex:Int16x:Int32x:Int64x:Objectx:Singlex:Stringx:TimeSpan
En el ejemplo de código siguiente se muestra cómo usar x:Arguments el atributo con tres Color constructores:
<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 x:Arguments etiqueta y los tipos de estos elementos deben coincidir con uno de los Color constructores. El Color constructor Xamarin_Forms Color _Color__ctor_System_Double_" data-linktype="absolute-path">con un solo parámetro requiere un valor de escala de grises de 0 (negro) a 1 (blanco). El Color constructor Xamarin_Forms Color _Color__ctor_System_Double_System_Double_System_Double_" data-linktype="absolute-path">con tres parámetros requiere un valor rojo, verde y azul que va de 0 a 1. El Color Xamarin_Forms Color _Color__ctor_System_Double_System_Double_System_Double_System_Double_" data-linktype="absolute-path">constructor con cuatro parámetros agrega un canal alfa como cuarto parámetro.
En las capturas de pantalla siguientes se muestra el resultado de llamar a cada Color constructor con los valores de argumento especificados:

Llamar a métodos de generador
Se puede llamar a los métodos de generador en XAML especificando el nombre del método mediante el atributo y x:FactoryMethod sus argumentos mediante el x:Arguments atributo . Un método de generador es un método que devuelve objetos o valores del mismo tipo public static que la clase o estructura que define los métodos.
La estructura define una serie de métodos de generador y en el ejemplo de código siguiente se muestra Color 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 y los tipos de estos elementos deben coincidir con los argumentos del método de generador al x:Arguments que se llama. El Xamarin_Forms _Color_FromRgba_System_Int32_System_Int32_System_Int32_System_Int32_" data-linktype="absolute-path">factory requiere cuatro parámetros, que representan los valores rojo, verde, azul y alfa, que van de 0 a FromRgbaInt32 255 respectivamente. El método de fábrica Xamarin_Forms _Color_FromHsla_System_Double_System_Double_System_Double_System_Double_" data-linktype="absolute-path">requiere cuatro parámetros, que representan los valores de matiz, saturación, luminosidad y alfa, que oscilan entre 0 y FromHslaDouble 1, respectivamente. El Xamarin_Forms _Color_FromHex_System_String_" data-linktype="absolute-path">factory method requiere un que represente el FromHex color hexadecimal String (A)RGB.
En las capturas de pantalla siguientes se muestra el resultado de llamar a cada Color método de generador con los valores de argumento especificados:

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 , como se muestra x:TypeArguments 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 es una clase genérica y se deben crear instancias con OnPlatform un atributo que coincida con el tipo de x:TypeArguments destino. En la clase , el atributo On Xamarin_Forms On _On_Platform" data-linktype="absolute-path">puede aceptar un solo valor o varios valores delimitados Platform por stringstring comas. En este ejemplo, la propiedad Xamarin_Forms _View_Margin" data-linktype="absolute-path">se establece en una propiedad específica StackLayout.Margin de la Thickness plataforma.
Para obtener más información sobre los argumentos de tipo genérico, vea Generics in Xamarin.Forms XAML .
Descarga del ejemplo