Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
It's often necessary to instantiate objects with constructors that require arguments, or by calling a static creation method. This can be achieved in .NET Multi-platform App UI (.NET MAUI) XAML by using the x:Arguments and x:FactoryMethod attributes:
- The
x:Argumentsattribute is used to specify constructor arguments for a non-default constructor, or for a factory method object declaration. For more information, see Pass constructor arguments. - The
x:FactoryMethodattribute is used to specify a factory method that can be used to initialize an object. For more information, see Call factory methods.
In addition, the x:TypeArguments attribute can be used to specify the generic type arguments to the constructor of a generic type. For more information, see Specify a generic type argument.
Arguments can be passed to constructors and factory methods using the following .NET MAUI XAML language primitives:
x:Array, which corresponds toArray.x:Boolean, which corresponds toBoolean.x:Byte, which corresponds toByte.x:Char, which corresponds toChar.x:DateTime, which corresponds toDateTime.x:Decimal, which corresponds toDecimal.x:Double, which corresponds toDouble.x:Int16, which corresponds toInt16.x:Int32, which corresponds toInt32.x:Int64, which corresponds toInt64.x:Object, which corresponds to theObject.x:Single, which corresponds toSingle.x:String, which corresponds toString.x:TimeSpan, which corresponds toTimeSpan.
With the exception of x:DateTime, the other language primitives are in the XAML 2009 specification.
Note
The x:Single language primitive can be used to pass float arguments.
Pass constructor arguments
Arguments can be passed to a non-default constructor using the x:Arguments attribute. Each constructor argument must be delimited within an XML element that represents the type of the argument.
The following example demonstrates using the x:Arguments attribute with three different Color constructors:
<BoxView HeightRequest="150"
WidthRequest="150"
HorizontalOptions="Center">
<BoxView.Color>
<Color>
<x:Arguments>
<x:Single>0.9</x:Single>
</x:Arguments>
</Color>
</BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
WidthRequest="150"
HorizontalOptions="Center">
<BoxView.Color>
<Color>
<x:Arguments>
<x:Single>0.25</x:Single>
<x:Single>0.5</x:Single>
<x:Single>0.75</x:Single>
</x:Arguments>
</Color>
</BoxView.Color>
</BoxView>
<BoxView HeightRequest="150"
WidthRequest="150"
HorizontalOptions="Center">
<BoxView.Color>
<Color>
<x:Arguments>
<x:Single>0.8</x:Single>
<x:Single>0.5</x:Single>
<x:Single>0.2</x:Single>
<x:Single>0.5</x:Single>
</x:Arguments>
</Color>
</BoxView.Color>
</BoxView>
The number of elements within the x:Arguments tag, and the types of these elements, must match one of the Color constructors. The Color constructor with a single parameter requires a grayscale float value from 0 (black) to 1 (white). The Color constructor with three parameters requires float red, green, and blue values ranging from 0 to 1. The Color constructor with four parameters adds a float alpha channel as the fourth parameter.
Call factory methods
Factory methods can be called in .NET MAUI XAML by specifying the method's name using the x:FactoryMethod attribute, and its arguments using the x:Arguments attribute. A factory method is a public static method that returns objects or values of the same type as the class or structure that defines the methods.
The Color class defines a number of factory methods, and the following example demonstrates calling three of them:
<BoxView HeightRequest="150"
WidthRequest="150"
HorizontalOptions="Center">
<BoxView.Color>
<Color x:FactoryMethod="FromRgba">
<x:Arguments>
<x:Byte>192</x:Byte>
<x:Byte>75</x:Byte>
<x:Byte>150</x:Byte>
<x:Byte>128</x:Byte>
</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>
The number of elements within the x:Arguments tag, and the types of these elements, must match the arguments of the factory method being called. The FromRgba factory method requires four byte arguments, which represent the red, green, blue, and alpha values, ranging from 0 to 255 respectively. The FromHsla factory method requires four float arguments, which represent the hue, saturation, luminosity, and alpha values, ranging from 0 to 1 respectively. The FromHex factory method requires a string argument that represents the hexadecimal (A)RGB color.
Specify a generic type argument
Generic type arguments for the constructor of a generic type can be specified using the x:TypeArguments attribute, as demonstrated in the following example:
<StackLayout>
<StackLayout.Margin>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,20,0,0" />
<On Platform="Android" Value="5, 10" />
</OnPlatform>
</StackLayout.Margin>
</StackLayout>
The OnPlatform class is a generic class and must be instantiated with an x:TypeArguments attribute that matches the target type. In the On class, the Platform attribute can accept a single string value, or multiple comma-delimited string values. In this example, the StackLayout.Margin property is set to a platform-specific Thickness.
For more information about generic type arguments, see Generics in XAML.