摘要:第 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 的类,该类派生自 ContentView
。 ColorViewList 示例演示了此方法。 ColorView
类派生自 ContentView
以显示特定的颜色及其名称,而 ColorViewListPage
类通常派生自 ContentPage
并显式创建 17 个 ColorView
实例。
访问 XAML 中的 ColorView
类需要另一个 XML 命名空间声明,对于同一程序集中的类,该声明通常称为 local
。
事件和处理程序
可以在 XAML 中将事件分配给事件处理程序,但是事件处理程序本身必须在代码隐藏文件中实现。 XamlKeypad 演示了如何在 XAML 中生成键盘用户界面以及如何在代码隐藏文件中实现 Clicked
处理程序。
点击手势
任何 View
对象都可以获取触控输入并根据该输入生成事件。 View
类定义了一个 GestureRecognizers
集合属性,该属性可以包含一个或多个派生自 GestureRecognizer
的类实例。
TapGestureRecognizer
生成 Tapped
事件。 MonkeyTap 程序演示了如何将 TapGestureRecognizer
对象附加到四个 BoxView
元素来创建模拟游戏:
但是 MonkeyTap 程序确实需要声音。 (请参阅下一章。)