Resumen del capítulo 8. Código y XAML en armonía

Download SampleDescargar el ejemplo

Nota:

Este libro se publicó en la primavera de 2016 y no se ha actualizado desde entonces. Gran parte del libro sigue siendo útil, pero algunos de los materiales están anticuados y algunos temas ya no son completamente correctos o completos.

En este capítulo se explora XAML más profundamente y, en particular, cómo interactúan el código y XAML.

Paso de argumentos

En general, una clase de la que se ha creado una instancia en XAML debe tener un constructor sin parámetros público; el objeto resultante se inicializa a través de la configuración de las propiedades. Sin embargo, hay otras dos maneras en las que se pueden crear instancias en los objetos e iniciarlos.

Aunque son técnicas de uso general, se usan principalmente en conexión con los modelos de vista MVVM.

Constructores con argumentos

En el ejemplo ParameteredConstructorDemo se muestra cómo utilizar la etiqueta x:Arguments para especificar argumentos de constructor. Estos argumentos se deben delimitar mediante etiquetas de elemento que indiquen el tipo del argumento. En el caso de los tipos de datos básicos de .NET, están disponibles las siguientes etiquetas:

  • x:Object
  • x:Boolean
  • x:Byte
  • x:Int16
  • x:Int32
  • x:Int64
  • x:Single
  • x:Double
  • x:Decimal
  • x:Char
  • x:String
  • x:TimeSpan
  • x:Array
  • x:DateTime

¿Puedo llamar a métodos desde XAML?

En el ejemplo FactoryMethodDemo se muestra cómo utilizar el elemento x:FactoryMethod para especificar un método Factory Method que se invoca para crear un objeto. Este método debe ser público y estático, y debe crear un objeto del tipo en el que se define. (Por ejemplo, el método Color.FromRgb es válido porque es público y estático y devuelve un valor de tipo Color). Los argumentos del método Factory Method se especifican en etiquetas x:Arguments.

Atributo x:Name

El atributo x:Name permite asignar un nombre a un objeto del que se ha creado una instancia en XAML. Las reglas para estos nombres son las mismas que para los nombres de variable de C#. Después de la devolución de la llamada de InitializeComponent en el constructor, el archivo de código subyacente puede hacer referencia a estos nombres para tener acceso al elemento XAML correspondiente. El analizador XAML convierte realmente los nombres en campos privados en la clase parcial generada.

En el ejemplo XamlClock se muestra el uso de x:Name para permitir que el archivo de código subyacente mantenga dos elementos Label definidos en XAML actualizados con la fecha y hora actuales.

No se puede usar el mismo nombre para varios elementos de la misma página. Se trata de un problema determinado si usa OnPlatform para crear objetos con nombre en paralelo para cada plataforma. En el ejemplo PlatformSpecificLabele se muestra una mejor manera de hacer una tarea de ese tipo.

Vistas personalizadas basadas en XAML

Hay varias maneras de evitar la repetición de marcado en XAML. Una técnica común consiste en crear una nueva clase basada en XAML que se derive de ContentView. Esta técnica se muestra en el ejemplo ColorViewList. La clase ColorView se deriva de ContentView para mostrar un color determinado y su nombre, mientras que la clase ColorViewListPage se deriva de ContentPage como de costumbre y crea explícitamente 17 instancias de ColorView.

El acceso a la clase ColorView en XAML requiere otra declaración de espacio de nombres XML, denominada normalmente local para las clases del mismo ensamblado.

Eventos y controladores

Los eventos se pueden asignar a los controladores de eventos en XAML, pero el propio controlador de eventos debe implementarse en el archivo de código subyacente. El ejemplo XamlKeypad muestra cómo compilar una interfaz de usuario de teclado en XAML y cómo implementar los controladores de Clicked en el archivo de código subyacente.

Gestos de pulsación

Cualquier objeto View puede obtener entradas táctiles y generar eventos a partir de esa entrada. La clase View define una propiedad de colección GestureRecognizers que puede contener una o más instancias de las clases que derivan de GestureRecognizer.

TapGestureRecognizer genera eventos Tapped. El programa MonkeyTap muestra cómo adjuntar objetos de TapGestureRecognizer a cuatro elementos de BoxView para crear un juego de imitación:

Triple screenshot of monkey tap

Pero el programa MonkeyTap realmente necesita sonido. (Vea el capítulo siguiente).