是! 静态设备类包括几个属性和方法,使您的代码可以在运行时以非常简单和直接的方式处理设备差异。
- Device.OS属性返回TargetPlatform枚举的成员:iOS,Android,WinPhone或其他。 WinPhone成员指的是所有的Windows和Windows Phone平台。
- Device.Idiom属性返回TargetIdiom枚举的成员:Phone,Tablet,Desktop或Unsupported。
两种名为OnPlatform的方法提供了更优雅的解决方案:
-
静态泛型方法OnPlatform
有三个类型T的参数 - 第一个是iOS,第二个是Android,第三个是Windows Phone(包含所有的Windows平台),然后返回运行平台的参数。 - 静态方法OnPlatform有四个类型为Action的参数(.NET函数delegate没有参数并返回void),也是iOS,Android和Windows Phone的顺序,第四个参数是默认参数,执行参数为 运行平台。
点击(此处)折叠或打开
-
Padding = Device.OnPlatform<Thickness>(new Thickness(0, 20, 0, 0),
-
new Thickness(0),
- new Thickness(0));
点击(此处)折叠或打开
-
Padding = Device.OnPlatform(new Thickness(0, 20, 0, 0),
-
new Thickness(0),
- new Thickness(0));
点击(此处)折叠或打开
- Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0);
但是,如果您只需要为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);
-
});
-
}
- }
点击(此处)折叠或打开
-
Device.OnPlatform(iOS: () =>
-
{
-
Padding = new Thickness(0, 20, 0, 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
- 类型为LayoutAlignment的Alignment属性,包含四个成员的枚举:
- bool类型的属性Expands
掌握使用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
-
};
-
}
- }
但是,这两种将文本居中的技巧实际上是完全不同的,正如您将在下一章中看到的那样。