解决方案3.仅包含适用于iOS的填充(PCL或SAP)
是! 静态设备类包括几个属性和方法,使您的代码可以在运行时以非常简单和直接的方式处理设备差异。
Device.OS属性返回TargetPlatform枚举的成员:iOS,Android,WinPhone或其他。 WinPhone成员指的是所有的Windows和Windows Phone平台。
Device.Idiom属性返回TargetIdiom枚举的成员:Phone,Tablet,Desktop或Unsupported。
您可以在if和else语句或switch和case块中使用这两个属性来执行特定于特定平台的代码。
两种名为OnPlatform的方法提供了更优雅的解决方案:
静态泛型方法OnPlatform 有三个类型T的参数 - 第一个是iOS,第二个是Android,第三个是Windows Phone(包含所有的Windows平台),然后返回运行平台的参数。
静态方法OnPlatform有四个类型为Action的参数(.NET函数delegate没有参数并返回void),也是iOS,Android和Windows Phone的顺序,第四个参数是默认参数,执行参数为 运行平台。
而不是在所有三个平台上设置相同的Padding属性,您可以通过使用Device.OnPlatform通用方法来限制Paddingto只是iPhone。
点击(此处)折叠或打开
Padding = Device.OnPlatform<Thickness>(new Thickness(0, 20, 0, 0),
new Thickness(0),
new Thickness(0));
第一个厚度参数是iOS版,第二个是Android版,第三个是Windows Phone版。 如果编译器可以从参数中找出它,则不需要在尖括号中明确指定Device.OnPlatform参数的类型,所以这也适用:
点击(此处)折叠或打开
Padding = Device.OnPlatform(new Thickness(0, 20, 0, 0),
new Thickness(0),
new Thickness(0));
或者,您可以只有一个厚度构造函数,并使用Device.OnPlatform作为第二个参数:
点击(此处)折叠或打开
Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
Padding通常会在需要的程序中设置。 当然,你可以用一些其他的数字替换零,如果你想在页面上添加一些填充。 有时候,两边的一个小垫子使得显示器更具吸引力。
但是,如果您只需要为iOS设置Padding,则可以使用Device.OnPlatformwith Action参数的版本。 这些参数在默认情况下是空的,所以你可以设置第一个在iOS上执行的操作。
点击(此处)折叠或打开
public class GreetingsPage : ContentPage
{
public GreetingsPage()
{
Content = new Label
{
Text = "Greetings, Xamarin.Forms!"
};
Device.OnPlatform(() =>
{
Padding = new Thickness(0, 20, 0, 0);
});
}
}
现在,只有当程序在iOS上运行时,才会执行设置填充的语句。 当然,对于Device.OnPlatform只有一个参数,对于需要读取代码的人来说可能有些模糊,所以您可能希望包含参数前面的参数名,以使其明确表示该语句只执行iOS版:
点击(此处)折叠或打开
Device.OnPlatform(iOS: () =>
{
Padding = new Thickness(0, 20, 0, 0);
});
像这样命名参数是C#4.0中引入的功能。
Device.OnPlatform方法非常方便,可以在PCL和SAP项目中使用。 但是,它不能访问各个平台内的API。 为此你需要DependencyService,这在第9章讨论。
解决方案4.将页面中的标签居中
文本与iOS状态栏重叠的问题仅仅是因为文本的默认显示位于左上角。 是否有可能将文本居中在页面上?
Xamarin.Forms支持一些设施来简化布局,而不需要程序执行涉及尺寸和坐标的计算。 View类定义了两个名为HorizontalOptions和VerticalOptions的属性,用于指定视图如何相对于其父(在本例中为ContentPage)进行定位。 这两个属性的类型是LayoutOptions,这是Xamarin.Forms中一个非常重要的结构。
一般来说,您将使用LayoutOptions结构,方法是指定它定义的返回LayoutOptions值的八个公共静态只读字段之一:
Start
Center
End
Fill
StartAndExpand
CenterAndExpand
EndAndExpand
FillAndExpand
但是,您也可以自己创建一个LayoutOptions值。 LayoutOptions结构还定义了两个实例属性,使您可以使用这些相同的组合创建一个值:
类型为LayoutAlignment的Alignment属性,包含四个成员的枚举:
Start, Center, End, and Fill.
bool类型的属性Expands
所有这些选项的更全面的解释等待着你在第4章“滚动堆栈”,但现在你可以将Label的HorizontalOptions和VerticalOptions属性设置为由LayoutOptions值定义的静态字段之一。 对于HorizontalOptions,单词开始意味着左边,结束意味着正确; 对于VerticalOptions,开始意味着顶部和结束意味着底部。
掌握使用HorizontalOptions和VerticalOptions属性是获取Xamarin.Forms布局系统技能的主要部分,但是这里有一个简单的例子,它将Label放在页面的中心。
点击(此处)折叠或打开
public class GreetingsPage : ContentPage
{
public GreetingsPage()
{
Content = new Label
{
Text = "Greetings, Xamarin.Forms!",
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center
};
}
}
以下是它的外观:
这是包含在本章示例代码中的Greetings程序的版本。 您可以使用HorizontalOptions和VerticalOptions的各种组合将文本放置在相对于页面的九个位置中的任意位置。
解决方案5.将标签中的文本居中
该标签的目的是显示一段文字的长度。 通常需要控制文本行如何水平对齐:左对齐,右对齐或居中。
Label视图为此目的定义了一个HorizontalTextAlignment属性,还为垂直定位文本定义了VerticalTextAlignment属性。 这两个属性都设置为TextAlignment枚举的成员,该成员名为Start,Center和End,对于从右向左或从上向下运行的文本具有足够的通用性。 对于英语和其他欧洲语言,开始意味着左边或顶部,结束意味着右边或底部。
对于iOS状态栏问题的最终解决方案,请将HorizontalTextAlignment和VerticalTextAlignment设置为TextAlignment.Center:
点击(此处)折叠或打开
public class GreetingsPage : ContentPage
{
public GreetingsPage()
{
Content = new Label
{
Text = "Greetings, Xamarin.Forms!",
HorizontalTextAlignment = TextAlignment.Center,
VerticalTextAlignment = TextAlignment.Center
};
}
}
在视觉上,这一行文本的结果与将HorizontalOptions和VerticalOptions设置为Center的结果相同,还可以使用这些属性的各种组合将文本定位到页面周围九个不同位置之一。
但是,这两种将文本居中的技巧实际上是完全不同的,正如您将在下一章中看到的那样。