后置代码是一个术语,用于描述当标记编译的 XAML 页面时,与标记定义对象结合的代码。 本主题介绍代码隐藏的要求,以及 XAML 中代码的替代内联代码机制。
本主题包含以下部分:
先决条件
本主题假定你在 WPF 中 已阅读 XAML,并且对 CLR 和面向对象的编程有一些基本知识。
Code-Behind 和 XAML 语言
XAML 语言包括语言级功能,可从标记文件这一侧将代码文件与标记文件关联。 具体而言,XAML 语言定义了语言功能 x:Class 指令、 x:Subclass 指令和 x:ClassModifier 指令。 确切地说,应如何生成代码,以及如何集成标记和代码,不是 XAML 语言所指定的内容的一部分。 由 WPF 等框架决定如何集成代码,以及如何在应用程序和编程模型中使用 XAML,以及实现所有这些所需的生成操作或其他支持。
WPF 中的后台代码、事件处理程序和部分类要求
分部类必须从用作根元素支撑的类型派生。
请注意,在标记编译生成作的默认行为下,可以在代码隐藏端的分部类定义中留空派生。 编译结果将假定页面根的基础类型是分部类的依据,即使未明确指定。 但是,依赖此行为并不是最佳做法。
在代码隐藏中编写的事件处理程序必须是实例方法,不能是静态方法。 这些方法必须由 CLR 命名空间中标识的
x:Class
分部类定义。 不能限定事件处理程序名称来指示 XAML 处理器在不同的类范围内查找事件处理程序以建立事件关联。处理程序必须与基础类型系统中适当事件的委托匹配。
对于专门Microsoft Visual Basic 语言,可以使用特定于
Handles
语言的关键字将处理程序与处理程序声明中的实例和事件相关联,而不是将处理程序与 XAML 中的属性附加。 但是,此方法确实存在一些限制,因为Handles
关键字不支持 WPF 事件系统的所有特定功能,例如某些路由事件方案或附加事件。 有关详细信息,请参阅 Visual Basic 和 WPF 事件处理。
x:Code
x:Code 是 XAML 中定义的指令元素。 指令 x:Code
元素可以包含内联编程代码。 定义为内联的代码可以与同一页面上的 XAML 进行交互。 下面的示例演示了内联 C# 代码。 请注意,代码位于 x:Code
元素内部,并且必须将代码括在 <CDATA[
...]]>
中以转义其内容,从而避免 XAML 处理器(无论是解释 XAML 架构还是 WPF 架构)尝试将内容按字面解释为 XML。
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyNamespace.MyCanvasCodeInline"
>
<Button Name="button1" Click="Clicked">Click Me!</Button>
<x:Code><![CDATA[
void Clicked(object sender, RoutedEventArgs e)
{
button1.Content = "Hello World";
}
]]></x:Code>
</Page>
内联代码限制
应考虑避免或限制内联代码的使用。 在体系结构和编码理念方面,保持标记与后台代码之间的分离使设计师和开发人员的角色分工更加明确。 在更技术层面,你为内联代码编写的代码可能很尴尬,因为你总是写入 XAML 生成的分部类,并且只能使用默认的 XML 命名空间映射。 由于不能添加 using
语句,因此必须完全限定你所做的许多 API 调用。 默认 WPF 映射包括 WPF 程序集中存在的大多数但并非所有 CLR 命名空间;必须完全限定对其他 CLR 命名空间中包含的类型和成员的调用。 也不能在内联代码中定义除分部类之外的任何内容,所引用的所有用户代码实体都必须作为生成的分部类中的成员或变量存在。 其他特定于语言的编程语言功能(如宏或 #ifdef
针对全局变量或生成变量)也不可用。 有关详细信息,请参阅 x:Code 内部 XAML 类型。