x:Subclass 指令

在同时提供 x:Class 时修改 XAML 标记编译行为。 提供的 x:Class 不是创建基于 x:Class 的分部类,而是创建为中间类,然后你提供的派生类应基于 x:Class

XAML 属性用法

<object x:Class="namespace.classname" x:Subclass="subclassNamespace.subclassName">
   ...
</object>

XAML 值

说明
namespace 可选。 指定包含 classname 的 CLR 命名空间。 如果已指定 namespace,则用点 (.) 分隔 namespaceclassname
classname 必需。 指定分部类的 CLR 名称,该分部类连接已加载的 XAML 和该 XAML 的代码隐藏。 请参阅“备注”。
subclassNamespace 可选。 如果每个命名空间都可解析另一个命名空间,则可以不同于 namespace。 指定包含 subclassName 的 CLR 命名空间。 如果已指定 subclassName,则用点 (.) 分隔 subclassNamespacesubclassName
subclassName 必需。 指定子类的 CLR 名称。

依赖项

x:Class 指令还必须在同一对象上提供,并且该对象必须是 XAML 产品的根元素。

备注

x:Subclass 用法主要用于不支持分部类声明的语言。

用作 x:Subclass 的类不能是嵌套类,并且 x:Subclass 必须引用根对象,如“依赖项”部分中所述。

否则,x:Subclass 的概念含义未由 .NET XAML 服务实现定义。 这是因为 .NET XAML 服务行为未指定连接 XAML 标记和支持代码的整体编程模型。 与 x:Classx:Subclass 相关的其他概念的实现由特定框架执行,这些框架使用编程模型或应用程序模型来定义如何连接 XAML 标记、编译标记和基于 CLR 的代码隐藏。 每个框架都有其自己的生成操作(用于实现某些行为)或特定组件(必须包含在生成环境中)。 在框架中,生成操作也可能因用于代码隐藏的特定 CLR 语言而异。

WPF 使用情况注释

x:Subclass 可以位于页面根目录,也可以位于应用程序定义中的 Application 根目录,后者已具有 x:Class。 如果在页面或应用程序根以外的任何元素上声明 x:Subclass,或者在不存在 x:Class 的地方指定它,则会导致编译时错误。

创建适合 x:Subclass 场景的派生类相当复杂。 可能需要检查中间文件(通过标记编译在项目的 obj 文件夹中生成的 .g 文件,其名称包含 .xaml 文件名)。 这些中间文件有助于你确定已编译应用程序中连接的分部类中某些编程构造的来源。

派生类中的事件处理程序必须是 internal override(在 Microsoft Visual Basic 中为 Friend Overrides),以便替代编译期间在中间类中创建的处理程序的存根。 否则,派生类实现隐藏(阴影)中间类实现并且不调用中间类处理程序。

定义 x:Classx:Subclass 时,无需为 x:Class 引用的类提供任何实现。 只需通过 x:Class 属性为其命名,以便编译器对其在中间文件中创建的类有一些指导(在这种情况下编译器不会选择默认名称)。 你可以为 x:Class 类提供实现;但这不是同时使用 x:Classx:Subclass 的典型场景。

另请参阅