摘要:第 8 章. 协调代码和 XAML

注意

本书于 2016 年春季出版,之后再未更新。 书中有许多内容仍然有价值,但有些内容已过时,有些主题不再完全正确或完整。

本章将更深入地探讨 XAML,尤其是代码与 XAML 的交互方式。

传递参数

在一般情况下,在 XAML 中实例化的类必须具有公共的无参数构造函数,生成的对象通过属性设置进行初始化。 但是,还有两种方法可以实例化和初始化对象。

尽管这些是通用方法,但它们通常与 MVVM 视图模型结合使用。

带有参数的构造函数

ParameteredConstructorDemo 示例演示了如何使用 x:Arguments 标记指定构造函数参数。 这些参数必须由指示参数类型的元素标记进行分隔。 对于基本 .NET 数据类型,可以使用以下标记:

  • 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

能否从 XAML 调用方法?

FactoryMethodDemo 示例演示了如何使用 x:FactoryMethod 元素指定被调用以创建对象的工厂方法。 此类工厂方法必须是公共的和静态的,并且必须创建定义该类型的对象。 (例如,Color.FromRgb 方法合格,因为它是公共的和静态的,并且返回类型为 Color 的值。)在 x:Arguments 标记中指定工厂方法的参数。

x:Name 属性

借助 x:Name 属性,允许为 XAML 中实例化的对象命名。 这些名称的规则与 C# 变量名称的规则相同。 在构造函数中返回 InitializeComponent 调用之后,代码隐藏文件可以引用这些名称以访问相应的 XAML 元素。 XAML 分析器实际上将名称转换为生成的分部类中的私有字段。

XamlClock 示例演示如何使用 x:Name,从而让代码隐藏文件能够使 XAML 中定义的两个 Label 元素随当前日期和时间进行更新。

同一名称不能用于同一页面上的多个元素。 如果使用 OnPlatform 为每个平台创建并行命名对象,那么这是一个特殊的问题。 PlatformSpecificLabele 示例演示了执行此类操作的更好方法。

自定义基于 XAML 的视图

有几种方法可以避免在 XAML 中重复标记。 一种常见的方法是创建一个新的基于 XAML 的类,该类派生自 ContentViewColorViewList 示例演示了此方法。 ColorView 类派生自 ContentView 以显示特定的颜色及其名称,而 ColorViewListPage 类通常派生自 ContentPage 并显式创建 17 个 ColorView 实例。

访问 XAML 中的 ColorView 类需要另一个 XML 命名空间声明,对于同一程序集中的类,该声明通常称为 local

事件和处理程序

可以在 XAML 中将事件分配给事件处理程序,但是事件处理程序本身必须在代码隐藏文件中实现。 XamlKeypad 演示了如何在 XAML 中生成键盘用户界面以及如何在代码隐藏文件中实现 Clicked 处理程序。

点击手势

任何 View 对象都可以获取触控输入并根据该输入生成事件。 View 类定义了一个 GestureRecognizers 集合属性,该属性可以包含一个或多个派生自 GestureRecognizer 的类实例。

TapGestureRecognizer 生成 Tapped 事件。 MonkeyTap 程序演示了如何将 TapGestureRecognizer 对象附加到四个 BoxView 元素来创建模拟游戏:

Monkey tap 的三倍屏幕截图

但是 MonkeyTap 程序确实需要声音。 (请参阅下一章。)