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的典型方案。

另请参阅