x:Subclass (Directiva)

Modifica el comportamiento de compilación de marcado XAML cuando también se proporciona x:Class. En lugar de crear una clase parcial basada en x:Class, se proporciona un x:Class creado como una clase intermedia y, a continuación, se espera que la clase derivada proporcionada se base en x:Class.

Uso de atributos XAML

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

Valores XAML

Value Descripción
namespace Opcional. Especifica un espacio de nombres CLR que contiene classname. Si se especifica namespace, un punto (.) separa namespace y classname.
classname Obligatorio. Especifica el nombre CLR de la clase parcial que conecta el XAML cargado y el código subyacente para ese XAML. Vea la sección Comentarios.
subclassNamespace Opcional. Puede ser diferente de namespace si cada espacio de nombres puede resolver el otro. Especifica un espacio de nombres CLR que contiene subclassName. Si se especifica subclassName, un punto (.) separa subclassNamespace y subclassName.
subclassName Obligatorio. Especifica el nombre CLR de la subclase.

Dependencias

La directiva x:Class también debe proporcionarse en el mismo objeto y ese objeto debe ser el elemento raíz de la producción XAML.

Comentarios

El uso de x:Subclass está pensado principalmente para lenguajes que no admiten declaraciones de clase parciales.

La clase usada como x:Subclass no puede ser una clase anidada y x:Subclass debe hacer referencia al objeto raíz, como se explica en la sección «Dependencias».

De lo contrario, el significado conceptual de x:Subclass no estará definido por una implementación de servicios XAML de .NET. Esto se debe a que el comportamiento de los servicios XAML de .NET no especifica el modelo de programación general por el que se conectan el marcado XAML y el código de respaldo. Las implementaciones de conceptos adicionales relacionados con x:Class y x:Subclass se realizan mediante marcos específicos que usan modelos de programación o modelos de aplicación para definir cómo conectar el marcado XAML, el marcado compilado y el código subyacente basado en CLR. Cada marco puede tener sus propias acciones de compilación que habilitan parte del comportamiento o componentes específicos que deben incluirse en el entorno de compilación. Dentro de un marco las acciones de compilación también pueden variar en función del lenguaje CLR específico que se usa para el código subyacente.

Notas de uso de WPF

x:Subclass puede estar en una raíz de página o en la raíz Application de la definición de la aplicación, que ya tiene x:Class. Declarar x:Subclass en cualquier elemento que no sea una raíz de página o de aplicación o especificarlo donde no existe x:Class genera un error en tiempo de compilación.

La creación de clases derivadas que funcionan correctamente para el escenario x:Subclass es bastante compleja. Es posible que tenga que examinar los archivos intermedios (los archivos .g generados en la carpeta obj del proyecto mediante la compilación de marcado, con nombres que incorporan los nombres de archivo .xaml). Estos archivos intermedios pueden ayudarle a determinar el origen de determinadas construcciones de programación en las clases parciales combinadas de la aplicación compilada.

Los controladores de eventos de la clase derivada deben ser internal override (Friend Overrides en Microsoft Visual Basic) para invalidar los códigos auxiliares de los controladores según se crean en la clase intermedia durante la compilación. De lo contrario, las implementaciones de clase derivada ocultarán («shadow») la implementación de clase intermedia y los controladores de clase intermedios no se invocarán.

Al definir x:Class y x:Subclass, no es necesario proporcionar ninguna implementación para la clase a la que hace referencia x:Class. Solo tiene que asignarle un nombre a través del atributo x:Class para que el compilador tenga algunas instrucciones para la clase que crea en los archivos intermedios (el compilador no selecciona un nombre predeterminado en este caso). Puede proporcionar a la clase x:Class una implementación; sin embargo, este no es el escenario típico para usar x:Class y x:Subclass.

Vea también