Código subyacente y XAML en WPF

Código subyacente es un término que se emplea para describir el código que se une con objetos definidos por marcado cuando se compila una página XAML mediante marcado. En este tema se describen los requisitos del código subyacente, así como un mecanismo de código insertado alternativo del código en XAML.

Este tema contiene las siguientes secciones:

Requisitos previos

En este tema se da por hecho que el usuario ha leído XAML en WPF y que tiene conocimientos básicos sobre la programación orientada a objetos y CLR.

Código subyacente y lenguaje XAML

El lenguaje XAML incluye características de nivel de lenguaje que permiten asociar archivos de código con archivos de marcado desde el lado del archivo de marcado. En concreto, el lenguaje XAML define las características del lenguaje x:Class (Directiva), x:Subclass (Directiva) y x:ClassModifier (Directiva). Dentro de lo que especifica el lenguaje XAML no se incluye exactamente cómo se debe generar el código y cómo integrar el marcado y el código. Se deja en manos de marcos como WPF el determinar cómo integrar el código, cómo usar XAML en los modelos de aplicación y programación y las acciones de compilación y demás compatibilidad que todo esto requiera.

Requisitos del código subyacente, los controladores de eventos y las clases parciales en WPF

  • La clase parcial debe derivar del tipo que respalda el elemento raíz.

  • Tenga en cuenta que, dentro del comportamiento predeterminado de las acciones de compilación de marcado, se puede dejar en blanco la parte de la derivación en la definición de clase parcial en el lado del código subyacente. El resultado compilado dará por hecho que el tipo de respaldo de la raíz de página es la base de la clase parcial, aunque no se especifique. Sin embargo, confiar en este procedimiento no es algo que recomendemos.

  • Los controladores de eventos que escriba en el código subyacente deben ser métodos de instancia y no pueden ser métodos estáticos. Estos métodos deben definirse mediante la clase parcial dentro del espacio de nombres de CLR, identificado mediante x:Class. No se puede calificar el nombre de un controlador de eventos para indicar a un procesador XAML que busque un controlador de eventos para la conexión de eventos en un ámbito de clase diferente.

  • El controlador debe coincidir con el delegado del evento adecuado en el sistema del tipo de respaldo.

  • En el lenguaje Microsoft Visual Basic en concreto, puede usar la palabra clave Handles específica del lenguaje para asociar controladores con instancias y eventos en la declaración del controlador, en lugar de conectar controladores con atributos en XAML. Pero esta técnica tiene algunas limitaciones porque la palabra clave Handles no puede admitir todas las características específicas del sistema de eventos de WPF, como determinados escenarios de eventos enrutados o eventos adjuntos. Para obtener más información, vea Control de eventos en Visual Basic y WPF.

x:Code

x:Code es un elemento de directiva definido en XAML. Un elemento de directiva x:Code puede contener código de programación insertado. El código que se define como insertado puede interactuar con el código XAML en la misma página. En el ejemplo siguiente se muestra código de C# insertado. Observe que el código está dentro del elemento x:Code y que el código debe estar rodeado de <CDATA[...]]> para aplicar escape al contenido de XML, de modo que un procesador XAML (que interpreta el esquema XAML o el esquema WPF) no intentará interpretar el contenido literalmente como 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>

Limitaciones del código insertado

Se debe sopesar si evitar o limitar el uso de código insertado. En términos de arquitectura y filosofía de la codificación, mantener una separación entre el marcado y el código subyacente establece una diferencia bastante más acusada entre los roles de diseñador y desarrollador. En un nivel más técnico, el código que se escribe para código insertado puede resultar incómodo de escribir, ya que siempre se escribe en la clase parcial generada por XAML y solo puede usar las asignaciones predeterminadas de espacios de nombres XML. Como no puede agregar instrucciones using, debe calificar por completo muchas de las llamadas API que realice. Las asignaciones predeterminadas de WPF incluyen la mayoría pero no todos los espacios de nombres CLR que están presentes en los ensamblados de WPF; tendrá que calificar completamente las llamadas a tipos y miembros contenidos en los otros espacios de nombres CLR. Tampoco podrá definir nada más allá de la clase parcial en el código insertado, y todas las entidades de código de usuario a las que haga referencia deben existir como miembro o variable dentro de la clase parcial generada. Del mismo modo, algunas otras características de programación específicas del lenguaje, como las macros o #ifdef en variables globales o variables de compilación, tampoco estarán disponibles. Para obtener más información, vea x:Code (Tipo XAML intrínseco).

Vea también