本文演示了如何使用XAML属性来将参数传递给非默认构造函数,调用工厂方法以及指定泛型参数的类型。
概观
通常需要使用需要参数的构造函数实例化对象,或者调用静态创建方法。 这可以通过使用x:Argument和x:FactoryMethod属性在XAML中实现:
-
x:Argument属性用于指定非默认构造函数或工厂方法对象声明的构造函数参数。 有关更多信息,请参阅传递构造函数参数。
-
x:FactoryMethod属性用于指定可用于初始化对象的工厂方法。 有关更多信息,请参阅调用工厂方法。
另外,x:TypeArguments属性可以用来为泛型类型的构造函数指定泛型类型参数。 有关更多信息,请参阅指定通用类型参数。
传递构造函数参数
可以使用x:Argument属性将参数传递给非默认构造函数。 每个构造函数参数都必须在表示参数类型的XML元素中分隔。 Xamarin.Forms支持以下基本类型的元素:
-
x:Object
-
x:Boolean
-
x:Byte
-
x:Int16
-
x:Int32
-
x:Int64
-
x:Single
-
x:Double
-
x:Decimal
-
x:Char
-
x:String
-
x:TimeSpan
-
x:Array
-
x:DateTime
下面的代码示例演示如何在三个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构造函数之一相匹配。 具有单个参数的Color构造函数需要从0(黑色)到1(白色)的灰度值。 具有三个参数的Color构造函数需要从0到1范围内的红色,绿色和蓝色值。具有四个参数的Color构造函数将添加一个alpha通道作为第四个参数。
以下屏幕截图显示了使用指定参数值调用每个Color构造函数的结果:
调用工厂方法
可以在XAML中通过使用x:FactoryMethod属性及其参数使用x:Arguments属性指定方法的名称来调用工厂方法。 工厂方法是一种公共静态方法,它返回与定义方法的类或结构相同类型的对象或值。
Color结构定义了许多工厂方法,下面的代码示例演示了如何调用其中的三个方法:
-
<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工厂方法需要四个Int32参数,分别表示红色,绿色,蓝色和Alpha值,范围分别为0到255。 FromHsla工厂方法需要四个Double参数,它们分别代表色调,饱和度,亮度和alpha值,范围从0到1。 FromHex工厂方法需要一个表示十六进制(A)RGB颜色的字符串。
以下屏幕截图显示了使用指定的参数值调用每个Color工厂方法的结果:
指定泛型类型参数
泛型类型的构造函数的泛型类型参数可以使用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="WinPhone, Windows" Value="10" />
-
</OnPlatform>
-
</StackLayout.Margin>
-
</StackLayout>
-
</ContentPage>
OnPlatform类是一个泛型类,必须使用与目标类型匹配的x:TypeArguments属性来实例化。 在On类中,Platform属性可以接受单个字符串值或多个以逗号分隔的字符串值。 在这个例子中,StackLayout.Margin属性被设置为平台特定的厚度。
概要
本文演示了使用XAML属性,可用于将参数传递给非默认构造函数,调用工厂方法以及指定泛型参数的类型。