毫无疑问,C#是世界上有史以来最伟大的编程语言之一。 您可以在C#中编写完整的Xamarin.Forms应用程序,并且可以想象,您已经发现C#非常适合Xamarin.Forms,您甚至没有考虑过使用其他任何东西。
但保持开放的态度。 Xamarin.Forms为C#提供了一种替代方案,它在程序开发的某些方面具有一些独特的优势。 此替代方法是XAML(发音为“zammel”),表示可扩展应用程序标记语言。 像C#一样,XAML是在微软公司开发的,它只比C#年轻几岁。
顾名思义,XAML遵循XML(可扩展标记语言)的语法。 本书假设您熟悉XML的基本概念和语法。
从一般意义上讲,XAML是一种用于实例化和初始化对象的声明性标记语言。 这个定义可能看起来过于笼统,XAML确实非常灵活。 但是大多数真实世界的XAML已经被用于定义图形编程环境特有的树形结构可视化用户界面。 基于XAML的用户界面的历史从Windows Presentation Foundation(WPF)开始,继续Silverlight,Windows Phone 7和8以及Windows 8和10.这些XAML实现中的每一个都支持由 特定的平台。 同样,Xamarin.Forms中的XAML实现支持由Xamarin.Forms定义的可视元素,如Label,BoxView,Frame,Button,StackLayout和ContentPage。
正如你所看到的,完全用代码编写的Xamarin.Forms应用程序通常定义其用户界面在派生自ContentPage的类的构造函数中的初始外观。 如果您选择使用XAML,则标记通常会替换此构造函数代码。 您会发现XAML提供了更简洁优雅的用户界面定义,并且具有更好地模仿页面上可视元素的树组织的可视化结构。
XAML通常比等效代码更易于维护和修改。 因为XAML是XML,所以它也可能被删除:与相应的C#代码相比,XAML更容易被软件工具解析和编辑。 事实上,XAML背后的一个早期推动力是促进程序员和设计师之间的协作:设计师可以使用生成XAML的设计工具,而程序员专注于与标记交互的代码。 虽然这个愿景可能只是很少被充分完善,但它肯定表明如何构建应用程序以适应XAML。 您使用XAML作为基础逻辑的视觉和代码。
然而,XAML超越了简单的分工。 正如您将在下一章中看到的那样,可以在XAML中正确定义绑定,将用户界面对象与基础数据链接起来。
在为Microsoft平台创建XAML时,一些开发人员使用Microsoft Blend等交互式设计工具,但许多其他人则更喜欢手写XAML。 没有设计工具可用于Xama?rin.Forms,所以手写是唯一的选择。 显然,本书中的所有XAML示例都是手写的。 但即使设计工具可用,手写XAML的能力也是一项重要技能。
出于另一个原因,手写XAML的前景可能会引起开发人员的惊愕:XML非常冗长。 但是,您几乎可以立即看到XAML通常比等效的C#代码更简洁。 但是,XAML的实际功能只是渐进式的,然而,直到第19章“集合视图”,当您使用XAML为ListView中显示的多个项目构建模板时才会完全显现。
对于喜欢强类型语言(比如C#)的程序员来说,怀疑所有文本字符串都是标记语言是很自然的。 但是你会很快看到XAML是如何非常严格的编程代码。 XAML文件允许的大部分内容由组成Xamarin.Forms应用程序编程接口的类和属性定义。 因此,您甚至可能会开始将XAML视为“强类型”标记语言。 XAML解析器基于底层API基础结构以非常机械的方式完成其工作。 本章和下一章的目标之一就是揭开XAML的神秘面纱,阐明在解析XAML时会发生什么。
然而,代码和标记是非常不同的:代码定义了一个进程,而标记定义了一个状态。 XAML有几种标记语言固有的缺陷:XAML没有循环,没有流量控制,没有代数计算语法,也没有事件处理程序。 但是,XAML定义了几个有助于弥补这些缺陷的功能。 您将在未来的章节中看到许多这些功能。
如果你不想使用XAML,你不需要。 任何可以在XAML中完成的事情都可以在C#中完成。 但要小心:有时候,开发人员会对XAML有一点点品味,并会被带走,并尝试在XAML中做所有事情! 像往常一样,最好的规则是“适用于所有事情”。许多最好的技术都是以交互方式组合代码和XAML。
让我们用一些代码片段和等效的XAML开始这个探索,然后看看XAML和代码如何在一个Xamarin.Forms应用程序中一起使用。