WPF 中的 Code-Behind 和 XAML

后台代码是一个术语,用于描述在 XAML 页面进行标记编译时与标记定义的对象结合的代码。 本主题介绍代码隐藏的要求,以及 XAML 中代码的替代内联代码机制。

本主题包含以下部分:

先决条件

本主题假定你已阅读 WPF 中的 XAML,并且对 CLR 和面向对象的编程有一些基本知识。

Code-Behind 和 XAML 语言

XAML 语言包括语言级别功能,使得可以从标记文件端将代码文件与标记文件相关联。 具体而言,XAML 语言定义 x:Class 指令x:Subclass 指令以及 x:ClassModifier 指令的语言功能。 确切地说,应如何生成代码,以及如何集成标记和代码,不是 XAML 语言所指定的内容的一部分。 由 WPF 等框架决定如何集成代码、如何在应用程序和编程模型中使用 XAML,以及所有这些需要的生成操作或其他支持。

WPF 中的代码隐藏、事件处理程序和分部类要求

  • 分部类必须从作为根元素支持的类型派生。

  • 请注意,在标记编译构建操作的默认行为下,您可以在代码隐藏部分的分部类定义中省略派生。 编译的结果将假定页面根的后盾类型是分部类的基础,即使未指定。 但是,依赖此行为并不是最佳做法。

  • 在代码隐藏文件中编写的事件处理程序必须是实例方法,不能是静态方法。 这些方法必须由 x:Class标识的 CLR 命名空间中的分部类定义。 不能限定某个事件处理程序的名称来指导 XAML 处理器在不同的类范围内查找用于事件连接的事件处理程序。

  • 处理程序必须与支持类型系统中相应事件的委托匹配。

  • 对于专门Microsoft Visual Basic 语言,可以使用特定于语言的 Handles 关键字将处理程序与处理程序声明中的实例和事件相关联,而不是将处理程序与 XAML 中的属性附加。 但是,此方法确实存在一些限制,因为 Handles 关键字不支持 WPF 事件系统的所有特定功能,例如某些路由事件方案或附加事件。 有关详细信息,请参阅 Visual Basic 和 WPF 事件处理

x:Code

x:Code 是 XAML 中定义的指令元素。 x:Code 指令元素可以包含内联编程代码。 内联定义的代码可以与同一页上的 XAML 交互。 下面的示例演示了内联 C# 代码。 请注意,代码位于 x:Code 元素内,并且代码必须由 <CDATA[...]]> 包围,以便转义 XML 的内容,这样 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 类型

另请参阅