Y he aquí que tomó simples cadenas y las convirtió en controles reales

Alguna vez necesité utilizar la mismas cadenas de texto en varios lugares de mis interfases. Luego necesité dar formato a esas cadenas: negrita, subrayado y cosas de esas. Después de rascarme la calva por un rato recordé que WPF puede instanciar controles en tiempo de ejecución basándose en simples cadenas de texto.

Primero recordar que el control más simple que nos permite dar formato al texto es el TextBlock, esto a través de su colección de Inlines, de modo que mi clase base para la funcionalidad que necesitó será TextBlock. Comenzando por el final, esta implementación me permitirá escribir algo como esto:

<congen:TextoRecurso Recurso=”{x:Static rec:Textos.Bienvenida}” />

donde:

· TextoRecurso: será nuestra implementación

· Recurso: La propiedad que recibirá los textos que pondremos en un archivo de recursos (resx)

· Textos.Bienvenida: Es la referencia al texto de llave “Bienvenida” ubicado en el archivo de recursos “Texto”.

· x:Static permite acceder directamente en XAML objetos estáticos dentro de la aplicación, como los elementos en un archivo de recursos. ¿No es XAML maravilloso?

Veamos uno de los textos que tendremos en el archivo de recursos:

<Run FontWeight=”Bold”>Bienvenido:</Run> <LineBreak/>Esta su lista de <Run TextDecorations=”Underline”>tareas </Run> para el día de hoy.

Este ejemplo es el típico contenido de un TextBlock con formato: Negrita, salto de línea y subrayado. Así las cosas, nuestra implementación nos permitirá ponernos creativos con el formato.

Y ahora la implementación, bastante corta debo anotar:

  1. public class TextoRecurso : TextBlock
  2. {
  3.   public string Recurso
  4.   {
  5.     set
  6.     {
  7.       Inlines.Clear();
  8.       Text = null;
  9.  
  10.       if (value == null) return;
  11.       StringBuilder SB = new StringBuilder();
  12.  
  13.       SB.Append(“<TextBlock xmlns=\”http://schemas.microsoft.com/winfx/2006/xaml/presentation\”>”);
  14.       SB.Append(value);
  15.       SB.Append(“</TextBlock>”);
  16.  
  17.       var TB =
  18.         XamlReader.Load(new System.Xml.XmlTextReader(
  19.           new System.IO.StringReader(SB.ToString()))) as TextBlock;
  20.       var Lista = TB.Inlines.ToArray();
  21.  
  22.       foreach (var item in Lista)
  23.       {
  24.         this.Inlines.Add(item);
  25.       }
  26.     }
  27.   }
  28. }

 

Todo lo que tiene es una propiedad “Recurso” donde se recibe cualquier texto que pudiéramos colocar dentro de un TextBlock en tiempo de diseño. Si, así como suena.

El procedimiento es muy sencillo. Comenzamos vaciando la colección de Inlines y luego utilizamos un StringBuilder para armar la cadena que contendrá el XAML de un TextBlock con el contenido que tomaremos del archivo de recursos (y que aquí obtendremos por medio del “value”).

Parte de la magia está en el primer “SB.Append”. Obsérvese que aquí tenemos el tag de apertura de un TextBlock pero, ya que eso es todo, debemos agregarle el espacio de nombres donde la clase TextBlock está alojada: http://schemas.microsoft.com/winfx/2006/xaml/presentation. Esto es muy importante ya que los “xmlns” son como los “using” de XML, y sin ellos el runtime no podrá identificar el TextBlock, luego no podrá instanciarlo, luego seguramente obtendremos una linda excepción. Ah, y ese espacio de nombres no me lo inventé. Es el espacio de nombres donde reside el TextBlock.

La otra parte de la magia , de hecho gran parte de ella, se la dejamos al XamlReader. Este objeto es el que se encarga de instanciar el TextBlock en base al texto que armamos. Al final de esto obtenemos un TextBlock con los Inlines suficientes para presentar un texto con formato. ¿Qué nos queda por hacer? pasar estos Inlines a nuestra implementación, lo que se hace en el siguiente ciclo.

Y eso es todo… sencillo. El tema es más oscuro que complicado.

Anuncios

Acerca de SilverIdeas

Instructor y entusiasta en el uso de Silverlight y otras tecnologías XAML.
Esta entrada fue publicada en Silverlight. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s