第二章:解剖一个应用程序(7)

简介:

解决方案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
        };
    }
}

以下是它的外观:
2018_01_29_212048

这是包含在本章示例代码中的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的结果相同,还可以使用这些属性的各种组合将文本定位到页面周围九个不同位置之一。
但是,这两种将文本居中的技巧实际上是完全不同的,正如您将在下一章中看到的那样。

目录
相关文章
|
7月前
|
存储 分布式计算 Java
深入探究JAVA编程语言:概念、应用与实例分析
**JAVA**是广泛应用的高级编程语言,以其易学性、跨平台能力和高效的性能著称。它采用面向对象编程,强调封装、继承和多态,且具备平台无关性、内置安全性和多线程支持。JAVA广泛应用于Web开发(如JSP、Servlet)、移动应用(Android开发)、大数据处理(Hadoop、Spark)和桌面应用。通过一个计算两数之和的简单示例,展示了JAVA的易读性和面向对象特性,帮助读者理解JAVA在实际开发中的运用。
|
7月前
|
编译器 API Windows
windows编程基础
windows编程基础
43 0
|
Java 图形学 Spring
Unity物理系统基本概念
Unity物理系统基本概念
111 0
|
数据可视化 测试技术 uml
【UML建模】(1) UML建模的初了解,概述,组成,作用
UML (Unified Modeling Language)是一种通用的可视化的建模语言,可以用来描述、可视化、构造和文档化软件密集型系统的各种工件。它不是一种程序设计语言。 UML 是独立于过程的,它可以在软件生命周期的各个阶段运用,不过主要应用于软件开发的设计与分析阶段。
473 0
【UML建模】(1) UML建模的初了解,概述,组成,作用
|
监控 数据可视化 测试技术
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
278 0
软工导第一节课 计算机软件工程学作一个简短的概述,回顾计算机系统发展简史 软件工程的基本原理和方法有概括的本质的认识,详细讲解生命周期相关知识讲解8种典型的软件过程模型
|
持续交付 测试技术 Devops
带你读《软件项目管理案例教程(第4版)》之三:生存期模型
本书以案例形式讲述软件项目管理过程,借助路线图讲述项目管理的理论、方法及技巧,覆盖项目管理十大知识域的相关内容,重点介绍软件这个特殊领域的项目管理。本书综合了多个学科领域,包括范围计划、成本计划、进度计划、质量计划、配置管理计划、风险计划、团队计划、干系人计划、沟通计划、合同计划等的制定,以及项目实施过程中如何对项目计划进行跟踪控制。该书取材新颖,注重理论与实际的结合,通过案例分析帮助读者消化和理解所学内容,既适合作为高等院校计算机、软件及相关专业高年级本科生和研究生的教材,也适合作为广大软件技术人员和项目经理培训的教材,还可作为软件开发项目管理人员的参考书。
|
Android开发 iOS开发 Windows
|
Android开发 iOS开发 Windows