WPF 中的代码隐藏和 XAML

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

本主题包含以下各节:

先决条件

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

代码隐藏和 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 类型

另请参阅