Silverlight:代码隐藏和分部类
代码隐藏是一个术语,用于描述在为某一应用程序进行标记编译时与 XAML 页 的分部类联接的代码。本主题描述针对代码隐藏类的要求、在代码隐藏中定义的 事件处理程序的要求以及与代码隐藏相关的机制(例如 InitializeComponent 方 法)的用途。
一般要求
*如果某一托管应用程序的 XAML 页进行了标记编译(Page 生成操作,且 MSBuild:MarkupCompilePass1 的值为“自定义工具”),则该页上的根元素应声 明一个 x:Class。作为回退,可能仅限代码隐藏文件(具有生成操作 Compile 的 DependentUpon 文件);请参见下一节中的说明。
代码隐藏和分部类要求
*分部类必须派生自用作根元素的类的类型。
注意说明:
尽管不建议这样做,但您可以在代码隐藏的分部类定义中将派生保留为空白, 只要标记声明了 x:Class。只有在您的页面完全没有事件处理程序或其他基于代 码的逻辑时,才应这样做。编译的结果会假定页根作为分部类的基类,即使在没 有指定的情况下也是如此(因为分部类的标记部分通过其根元素标记隐式指定了 基类)。
*分部类必须是公共的。这是必需的,因为在进行标记编译时通过标记 x:Class 定义的分部类是公共的,因此,代码分部类必须使用相同的访问以便与 标记的分部类联接。
*您可以选择省略某一命名空间,只要这符合声明您的 x:Class 的方式。
事件处理程序要求
*编写的事件处理程序必须是 x:Class 标识的命名空间中的分部类所定义的实 例方法。您不能限定事件处理程序的名称来指示 XAML 处理器在其他类范围中查 找该处理程序,也不能将静态方法用作事件处理程序。
*事件处理程序无需是公共的;它们可以是私有的或内部的。通常建议编写非 公共事件处理程序。
*事件处理程序必须与相应事件的委托匹配。请注意,某些事件将一般处理程 序来用于约束的事件数据。在这些情况下,对事件签名中指示的事件数据使用约 束。
*可以为不同对象上的同一事件共享事件处理程序。如果委托允许,还可为不 同的事件类型共享相同的处理程序。但如果您这样做了,则您的事件处理程序逻 辑应使用 sender 和/或 OriginalSource 的值来区分事件源。
*专门针对 Visual Basic 语言,您可以使用特定于语言的 Handles 关键字将 处理程序与处理程序声明中的实例和事件关联,而不是在 XAML 中将处理程序附 加到属性。但是,这一技术确实存在一些限制,因为 Handles 无法支持该事件系 统的所有特定功能,例如某些路由事件方案。
分部类功能
如果您查看从 Silverlight 项目模板创建的分部类,则将看到它以模板创建 的代码作为开头,该代码具有调用 InitializeComponent 方法的构造函数。您通 常不自己编写 InitializeComponent。InitializeComponent 是在对与代码隐藏 关联的页面进行标记编译时由 Silverlight 目标通过代码生成的。您可以通过在 成功编译后查找您的项目的 obj 文件夹,查看代码生成的 InitializeComponent 。查找在其名称中具有 .g. 的文件,.g. 在您的代码隐藏文件名的名称和扩展名 之间插入。打开此文件并查看 InitializeComponent 定义。
*InitializeComponent 主要用于连接字段,这些字段持有对通过对 XAML 进 行标记编译创建的各个对象的引用。通过这些字段,代码隐藏中的代码能够对在 XAML 中定义对象的对象元素中提供 Name / x:Name 属性的任何对象生成运行时 引用。如果不能按名称检索对象,则需要从入口点遍历 Silverlight 对象树(例 如从事件处理程序的 sender 或者 RootVisual),以便找到特定的对象。
*InitializeComponent 还在类用作 RootVisual 时初始化 Silverlight 内容 区域的呈现。
在托管 API 中,它是 Application 对象,控制在 Silverlight 内容区域中 显示的内容;为此,它必须能够将其 RootVisual 设置为 UIElement 类的实例。 因此,您通常需要对想要作为托管的基于 Silverlight 的应用程序内容加载的任 何 XAML 页根声明 x:Class,以便 RootVisual 可以引用该类,即使在该页中没 有代码隐藏。