miércoles, 14 de enero de 2009

Create controls in WPF at runtime

El WPF ha sido mi dolor de cabeza desde hace un par de días, así que me he pasado un buen rato consultando otros sitios, como en muchas otras ocasiones me he quedado con la intención de una vez resuelto mi problema poder exponer mi caso y la solución, asi que, en esta ocasión aqui va.

Problema: ¿Cómo le hago para generar controles de WPF en tiempo de ejecución? bueno pues la manera en cómo yo lo necesitaba era a través de XAML, es decir, tengo una clase que se encargada de generar el XAML y que se encuentra fuera de la ventana principal, es decir, no tiene referencias hacia System.Windows.blahblahblah, de esta manera una vez que se genera el XAML guardo esto en un string común y corriente y se lo paso a la ventana para que lo agregue a su grid principal.

Los controles a generar son:

TextBox
Button
Label

Generar el XAML es lo más sencillo, ésto es:

<grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x="http://schemas.microsoft.com/winfx/2006/xaml">

<textbox width="68.4" name="UC_0" margin="115.2,14.4,0,0" verticalalignment="Top" horizontalalignment="Left" height="23"></textbox>

<label width="105.6" name="Lbl_0" margin="27.6,16,0,0" verticalalignment="Top" horizontalalignment="Left" height="23">Operador: </label>

<button name="bnNextWindow" width="75" margin="12,0,0,12" verticalalignment="Bottom" horizontalalignment="Left" height="23">Siguiente</button>

</grid>

Solución:

Ahora viene lo bueno, ¿cómo hago para que éste XAML se muestre en la ventana?

string xaml = "<Grid xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">";

xaml += "<TextBox Width="68.4" Name="UC_0" Margin="115.2,14.4,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Height="23"></TextBox>";

xaml += "<Label Width="105.6" Name="Lbl_0" Margin="27.6,16,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Height="23">Operador: </Label>";

xaml += "<Button Name="bnNextWindow" Width="75" Margin="12,0,0,12" VerticalAlignment="Bottom" HorizontalAlignment="Left" Height="23">Siguiente</Button>";

xaml += "</Grid>";

StringReader reader = new StringReader(xaml);
XmlReader xml = XmlReader.Create(reader);
this.Content = XamlReader.Load(xml);

Finalmente al correr el programa nos queda esto:



Referencias:

System.Windows.Markup
System.IO
System.Xml

1 comentario:

  1. Juan, un favor, podrías subir tu ejemplo completo?, me tengo la necesidad de hacer algo similar

    ResponderEliminar