<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://geeks.ms/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Luis Guerrero - Dot Net World : windows forms</title><link>http://geeks.ms/blogs/luisguerrero/archive/tags/windows+forms/default.aspx</link><description>Etiquetas: windows forms</description><dc:language /><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>[Curso] WPF para programadores de Windows Forms 7</title><link>http://geeks.ms/blogs/luisguerrero/archive/2008/11/29/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_7.aspx</link><pubDate>Sat, 29 Nov 2008 18:15:51 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:122322</guid><dc:creator>Luis Guerrero</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/rsscomments.aspx?PostID=122322</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/commentapi.aspx?PostID=122322</wfw:comment><comments>http://geeks.ms/blogs/luisguerrero/archive/2008/11/29/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_7.aspx#comments</comments><description>&lt;p&gt;Hola a todos de nuevo, volvemos a la carga con otro artículo sobre WFP para programadores de Windows Forms. En este articulo voy a hablar sobre los diferentes tipos de controles que hay en WPF y como encontramos similitud con los controles de WF.&lt;/p&gt;  &lt;p&gt;En artículos anteriores estuvimos hablando sobre el árbol de herencia de WPF y sobre las diferentes clases de las que heredaba un control normal de WPF, pusimos como ejemplo &lt;a title="Label Class" href="http://msdn2.microsoft.com/ms611056.aspx"&gt;Label&lt;/a&gt;, al ser un control que vamos a usar mucho en nuestras aplicaciones.&lt;/p&gt;  &lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;   &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;System.Object
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ContentControl
                System.Windows.Controls.Label&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ahora en este curso nos vamos a posicionar en &lt;a title="UIElement Class" href="http://msdn2.microsoft.com/ms590078.aspx"&gt;System.Windows.UIElement&lt;/a&gt; y vamos a ver las diferentes ramas de las cuales salen los demás controles de WPF y ver que funcionalidad nos proporciona.&lt;/p&gt;

&lt;p&gt;&lt;a title="UIElement Class" href="http://msdn2.microsoft.com/ms590078.aspx"&gt;UIElement&lt;/a&gt; es la primera clase de WPF que tiene soporte para dibujado (heredado de &lt;a title="Visual Class" href="http://msdn2.microsoft.com/ms635637.aspx"&gt;Visual&lt;/a&gt;), soporte para entrada (Input, heredado de &lt;a title="DispatcherObject Class" href="http://msdn2.microsoft.com/ms615925.aspx"&gt;DispatcherObject&lt;/a&gt;) y soporte para RouteEvents. Así que técnicamente esta es la clase que tendríamos que usar si queremos empezar a dibujar algo en la pantalla, es la clase que da un soporte más primitivo para el dibujado. En la clase &lt;a title="UIElement Class" href="http://msdn2.microsoft.com/ms590078.aspx"&gt;UIElement&lt;/a&gt; tenemos un método virtual OnRender que podemos sobreescribir en nuestras clase para poder implementar la funcionalidad personalizada de dibujado de esa clase, en la que se nos pasa un &lt;a title="DrawingContext Class" href="http://msdn2.microsoft.com/ms653182.aspx"&gt;DrawingContext&lt;/a&gt; con el que dibujamos la UI del control. &lt;a title="DrawingContext Class" href="http://msdn2.microsoft.com/ms653182.aspx"&gt;DrawingContext&lt;/a&gt;es muy parecido a la clase Graphics de GDI y de hecho tiene métodos muy parecidos. &lt;/p&gt;

&lt;p&gt;Aquí podemos ver un ejemplo de un control que se dibuja a si mismo con este método.&lt;/p&gt;

&lt;div style="border-bottom:gray 1px solid;border-left:gray 1px solid;padding-bottom:4px;line-height:12pt;background-color:#f4f4f4;margin:20px 0px 10px;padding-left:4px;width:97.5%;padding-right:4px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;max-height:200px;font-size:8pt;overflow:auto;border-top:gray 1px solid;cursor:text;border-right:gray 1px solid;padding-top:4px;"&gt;
  &lt;pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; WigoVisual : UIElement
    {
        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; Pen pincel;
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; WigoVisual()
        {
            pincel = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Pen(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Red), 20);
        }
        &lt;span style="color:#0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnRender(DrawingContext drawingContext)
        {
            &lt;span style="color:#0000ff;"&gt;base&lt;/span&gt;.OnRender(drawingContext);
            drawingContext.DrawLine(pincel, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Point(0, 0), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Point(100, 100));
            drawingContext.DrawRectangle(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Green), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Pen(&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; SolidColorBrush(Colors.Blue), 5),
                &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Rect(0, 0, 20, 20));
        }
    }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;El control dibuja una línea desde (0,0) hasta (100,100) con el bolígrafo especificado, evidentemente esta clase no tiene soporte para Layout de ninguna manera porque nosotros al dibujar el control no tenemos en cuenta propiedades con Width o ActualWidth para dibujar la línea. &lt;/p&gt;

&lt;p&gt;Como podréis comprender esta clase es muy básica en cuanto al soporte de Layout pero muy ponente para un dibujado más personalizado, si queremos ganar en funcionalidad existente tenemos que bajar en el árbol de herencia. La única clase pública del framework que hereda de &lt;a title="UIElement Class" href="http://msdn2.microsoft.com/ms590078.aspx"&gt;UIElement&lt;/a&gt; es &lt;a title="FrameworkElement Class" href="http://msdn2.microsoft.com/ms602714.aspx"&gt;FrameworkElement&lt;/a&gt;, y es en esta clase donde se define mucha de la funcionalidad común de todos los controles del Framework, (es por eso que creo que se llama FrameworkElement). &lt;/p&gt;

&lt;p&gt;FrameworkElement añade una serie de funcionalidad para que el soporte de Layout de la clase sea mucho más rico que con UIElement. Veámosla.&lt;/p&gt;

&lt;p&gt;· Definición del sistema de Layout: define una serie de métodos que eran virtuales en UIElement para implementar el sistema de Layout de WPF.&lt;/p&gt;

&lt;p&gt;· Define el árbol lógico de una aplicación WPF y deja la responsabilidad de definir cuál es a las clases herederas. &lt;/p&gt;

&lt;p&gt;· Define los eventos del ciclo de vida de un control, eventos como Initialized, Loaded, Unloaded.&lt;/p&gt;

&lt;p&gt;· Soporte para enlace a datos dinámico y búsqueda dinámica de recursos estáticos dentro del control.&lt;/p&gt;

&lt;p&gt;· Define los estilos (Style) para los controles.&lt;/p&gt;

&lt;p&gt;· Define el soporte para las animaciones de los controles. &lt;/p&gt;

&lt;p&gt;FrameworkElement define una serie de propiedades básicas con las que podremos empezar a definir el Layout y los demás propiedades de la UI, a partir de esta clase podemos empezar a realizar Layout más complicados sin tener que explícitamente programarlos.&lt;/p&gt;

&lt;p&gt;WPF permite que los programadores puedan sacar todo el partido del Layout a partir de una serie de clases que añaden funcionalidad especifica del nivel en el que se encuentran. Si volvemos atrás en el tiempo y recordamos como en Visual Basic 6 se hacían las cosas, los programadores más avanzados se hacían los cálculos ellos mismos para hacer que el control se moviese o fluyera a través del formulario, pero todos los cálculos tenían que ser hechos a mano, después con Windows Forms Microsoft nos dio dos propiedades muy interesantes de la clase Control Anchor y Dock, que permiten que un control se puedan quedar pillado a alguna de sus caras, o lo que es lo mismo que mantenga siempre la misma distancia. Todo este trabajo que antes se hacía a mano en Visual Basic ahora lo tenemos de “serie” dentro de Windows Forms, pues si seguimos avanzando en WPF ese cálculo de distancias se ha llevado al extremo, eso no significa que no se calcule internamente sino que no somos nosotros los responsables de hacer esos cálculos sino que WPF los hace por sí mismo. &lt;/p&gt;

&lt;p&gt;Saludos. Luis.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=122322" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/wpf/default.aspx">wpf</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/WPF+-_3E00_+Windows+Forms/default.aspx">WPF -&gt; Windows Forms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windows+forms/default.aspx">windows forms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/curso/default.aspx">curso</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/Layout/default.aspx">Layout</category></item><item><title>[Curso] WPF para programadores de Windows Forms 5</title><link>http://geeks.ms/blogs/luisguerrero/archive/2008/07/24/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_4.aspx</link><pubDate>Thu, 24 Jul 2008 12:30:41 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:92549</guid><dc:creator>Luis Guerrero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/rsscomments.aspx?PostID=92549</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/commentapi.aspx?PostID=92549</wfw:comment><comments>http://geeks.ms/blogs/luisguerrero/archive/2008/07/24/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_4.aspx#comments</comments><description>&lt;p&gt;[Básico – Medio]&lt;/p&gt;  &lt;p&gt;Hola de nuevo, hoy vamos a hablar de una característica muy interesante de WPF, los DataTemplate o Data Templating.&lt;/p&gt;  &lt;p&gt;¿Qué es un DataTemplate?&lt;/p&gt;  &lt;p&gt;Es, como su nombre incica, una plantilla de datos. Pero, ¿a que se refiere con datos?, pues con datos se refiere a cualquier elemento dentro del árbol de controles de WFP. Eso incluye controles, controles de usuario y en general cualquier instancia de una clase. Eso significa que podemos añadir a un ListBox un elemento nuevo y que este sea una clase de negocio que represente un pedido. &lt;/p&gt;  &lt;p&gt;Esta característica está muy bien, ya que no necesitamos utilizar ningún tipo de patrón a la hora de añadir a la presentación de nuestras aplicaciones nuestros objetos de negocio. Simplemente añadiéndolo. Pero el caso es que, cuando alguien añada una clase de objeto de negocio a una lista de elementos de un ListBox, el ListBox no sabe como “pintar” o representar ese elemento dentro de la UI, así que lo único que hace es llamar al método ToString() de nuestra clase de negocio. &lt;/p&gt;  &lt;p&gt;Podemos por supuesto sobrescribir el método ToString() de nuestra clase de negocio pero el caso es que solamente seremos capaces de representar texto en la interfaz de usuario, y teniendo en cuenta las capacidades de WPF eso es algo que no se puede permitir. Tenemos que tener alguna manera de especificar cómo queremos que se dibuje ese &lt;i&gt;Tipo&lt;/i&gt; de dato en pantalla. &lt;/p&gt;  &lt;p&gt;Aquí es donde entran los DataTemplate, esta clase es una árbol de controles que van a representar nuestro objeto de negocio.&lt;/p&gt;  &lt;p&gt;Imaginemos por un momento que tenemos una clase Cliente tal que así:&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; ClienteV1
  {
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; Nombre { get; set; }
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; CodigoCliente { get; set; }
      &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; DateTime Fecha { get; set; }
  }&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Tenemos una serie de propiedades que definen el estado de nuestro cliente, pues bien lo que vamos a hacer es definir un árbol de controles en XAML para representar la clase cliente.&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WrapPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Label&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBox&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;WrapPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Ahora mismo únicamente tenemos un XAML que define un árbol de controles que podríamos utilizar para representar nuestra clase cliente, lo único que nos falta es “mapear” o enlazar a datos (DataBinding) las propiedades del objeto de negocio cliente con los controles de nuestro árbol. Se hace así:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;WrapPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding Path=Nombre}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBox&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding Path=Fecha}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;TextBlock&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Text&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{Binding Path=CodigoCliente}&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;WrapPanel&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Si nos fijamos por ejemplo en la etiqueta Label, en el atributo “Content” tenemos esto:&lt;/p&gt;

&lt;p&gt;Content=”{Binding Path=Nombre}”&lt;/p&gt;

&lt;p&gt;¿Qué estamos especificando ahí?, pues básicamente lo que le queremos decir a WPF es que si en el objeto de destino (nuestra clase Cliente) encuentra por reflexión una propiedad, y repito solo funciona con propiedades, con ese nombre pues que obtenga su valor y que lo establezca en la Dependency Property Content del control Label.&lt;/p&gt;

&lt;p&gt;Pues ya esta!!.&lt;/p&gt;

&lt;p&gt;Ya tenemos definido nuestro DataTemplate para el objeto de negocio Cliente. Es más aunque tenemos sobrescrito el método ToString() en nuestra clase Cliente WPF no hace caso y simplemente establece el DataTemplate.&lt;/p&gt;

&lt;p&gt;Características avanzadas de los DataTemplate.&lt;/p&gt;

&lt;p&gt;Nosotros en el ejemplo que hemos realizado hemos establecido el valor de este DataTemplate para el control en que estamos, en nuestro caso un ListBox. Puede ser muy común que este DataTemplate se tenga que usar en más sitios dentro de WPF, y lo suyo sería tenerlo como un recurso compartido para que sea accesible desde cualquier sitio. Esto se puede hacer así:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;height:53px;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ListBox&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Right&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Margin&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;0,70,57,45&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;85&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;IsSynchronizedWithCurrentItem&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;True&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;ItemTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{DynamicResource DataTemplate1}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Ahora bien tenemos que definir ese DynamicResource con valor DataTemplate1. Esto se hace a través de unos ficheros llamados ResourcesDiccionary que son una especie de ficheros xaml que solamente contiene recursos compartidos por la aplicación, podemos ver uno aquí:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary&lt;/span&gt;
&lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt; 
&lt;span style="color:#ff0000;"&gt;xmlns:x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Key&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;DataTemplate1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;DataTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;&amp;lt;!-- Resource dictionary entries should be defined here. --&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Aunque se haya creado este fichero se tiene que especificar de alguna manera como se tiene que hacer referencia en todo el proyecto, para eso existen los recursos a nivel de aplicación, que los tenemos disponibles en el fichero app.xaml.&lt;/p&gt;

&lt;p&gt;Pero lo que tenemos en este fichero son los recursos en sí, no referencias a ficheros externos. Así que tenemos que combinar todos los diccionarios en uno para que sean usados de manera global. &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Source&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;ResourceDictionary.xaml&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary.MergedDictionaries&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ResourceDictionary&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Y así es como se combinan los diccionarios para que estén disponibles en toda la aplicación. &lt;/p&gt;

&lt;p&gt;El codigo de la aplicación esta aquí [&lt;a href="http://www.luisguerrero.net/downloads/CursoWPF5.zip" target="_blank"&gt;CursoWPF5.zip&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;En el siguiente post del curso hablaremos un poco más en detalle de los DataTemplates, como subscribirse a eventos dentro de los controles que están en la DataTemplate y además como hacer DataTemplates a partir de código. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=92549" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/wpf/default.aspx">wpf</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windowsforms/default.aspx">windowsforms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/WPF+-_3E00_+Windows+Forms/default.aspx">WPF -&gt; Windows Forms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windows+forms/default.aspx">windows forms</category></item><item><title>[Curso] WPF para programadores de Windows Forms – Parte 3</title><link>http://geeks.ms/blogs/luisguerrero/archive/2008/07/15/curso-wpf-para-programadores-de-windows-forms-parte-3.aspx</link><pubDate>Tue, 15 Jul 2008 20:18:09 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:91797</guid><dc:creator>Luis Guerrero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/rsscomments.aspx?PostID=91797</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/commentapi.aspx?PostID=91797</wfw:comment><comments>http://geeks.ms/blogs/luisguerrero/archive/2008/07/15/curso-wpf-para-programadores-de-windows-forms-parte-3.aspx#comments</comments><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Ahora que ya hemos las diferencias entre las arquitecturas en WPF y Windows Forms es el momento de comparar como se programa en ambas tecnologías. Vamos a comparar cuales son las características para programar con WPF y WF, además de hacer el típico Hola Mundo.&lt;/p&gt;  &lt;p&gt;Ambas tecnologías se programan con algún lenguaje incluido en .net framework, WF viene desde la versión 1.0 del framework, mientras que WPF viene incluido en la versión 3.0, 3.0 SP1, 3.5 y 3.5 SP1.&lt;/p&gt;  &lt;p&gt;En WPF tenemos dos maneras de definir la interfaz de usuario de nuestros programas, a través de código trasero o a través de XAML. Es algo parecido a como se programa en ASP.NET, se tiene un fichero con extensión aspx que contiene el html y el código de los controles de servidor de ASP.NET y además tenemos el fichero de código trasero asociado con este fichero aspx, por ejemplo podemos tener un Default.aspx y un Default.aspx.cs. Los dos ficheros están asociados a través de la clase que contienen. &lt;/p&gt;  &lt;p&gt;Pues bien en WPF es igual, tenemos un fichero Window1.xaml que contiene el código XAML de la UI de la ventana y además tenemos el Window1.xaml.cs que contiene el fichero de código fuente asociado a este fichero xaml. En WPF, como en ASP.NET, se tiene que asociar de alguna manera el fichero xaml con el fichero cs para que se pueda acceder a los controles definidos en el xaml. Por ejemplo tenemos un fichero Window1.xaml definido así&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;xmlns:x&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;x:Class&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;WpfApplication1.Window1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Window&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;Title&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Window1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;640&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Height&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;480&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;x:Name&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;LayoutRoot&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Window&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Y tenemos otro fichero Window1.xaml.cs definido de esta manera:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Linq;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Text;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Controls;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Data;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Documents;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Input;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Media;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Media.Imaging;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Navigation;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Shapes;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; WpfApplication1
{
    &lt;span style="color:#008000;"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// Interaction logic for Window1.xaml&lt;/span&gt;
    &lt;span style="color:#008000;"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Window1 : Window
    {
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; Window1()
        {
            InitializeComponent();
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Si nos fijamos en el fichero Window1.xaml.cs está definido un namespace WpfApplication1 y este contiene una clase parcial Window1 que hereda de Syste.Windows.Window, pues bien esta clase Window1 es la que contiene la lógica de la ventana que estamos creando. En el fichero Window1.xaml dentro del nodo Window hay un atributo del namespace {x} definido así xmlns:x=&lt;a href="http://schemas.microsoft.com/winfx/2006/xaml"&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/a&gt; y este tiene una propiedad Class en que está establecido el nombre de la clase a la que está asociada esta ventana, hay que tener en cuenta que esta el namespace completo WpfApplication1.Window1 y no directamente Window1, esto es porque después la clase se localizará por reflexión y dentro en la definición de IL no existen namespaces como en C# así que técnicamente el nombre de esa clase no es Window1, sino WpfApplication1.Window1.&lt;/p&gt;

&lt;p&gt;Esta sería la manera de asociar un fichero xaml con su correspondiente fichero cs de code behind. Nosotros en este primer ejemplo de Hola Mundo lo vamos a hacer directamente el código todo para familiarizarnos con el entorno y con las clases que hay disponibles.&lt;/p&gt;

&lt;p&gt;Primero vamos a definir el código fuente mínimo necesario para insertar un botón dentro de un formulario y al pulsar ese botón que salga un mensaje de Hola Mundo. Así sería en Windows Forms&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Drawing;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Forms;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; WindowsFormsApplication1
{

    &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program
    {
        [STAThread]
        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()
        {
            Form form = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Form();
            Button button = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Button();
            button.Text = &lt;span style="color:#006080;"&gt;&amp;quot;Hola Mundo Windows Forms&amp;quot;&lt;/span&gt;;
            button.Location = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Point(10, 10);
            button.Click += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; EventHandler(OnButtonClick);
            form.Controls.Add(button);
            Application.Run(form);
        }

        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnButtonClick(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, EventArgs e)
        {
            MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Hola mundo WF&amp;quot;&lt;/span&gt;);
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Y así sería en WPF.&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows;
&lt;span style="color:#0000ff;"&gt;using&lt;/span&gt; System.Windows.Controls;

&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; WpfApplication1
{
    &lt;span style="color:#0000ff;"&gt;class&lt;/span&gt; Program
    {
        [STAThread]
        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; Main()
        {
            Window window = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Window();
            Button button = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Button();
            button.Content = &lt;span style="color:#006080;"&gt;&amp;quot;Hola Mundo Windows Presentation Foundation&amp;quot;&lt;/span&gt;;
            button.Click += &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; RoutedEventHandler(OnButtonClick);
            window.Content = button;
            Application app = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; Application();
            app.Run(window);
        }

        &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;void&lt;/span&gt; OnButtonClick(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
        {
            MessageBox.Show(&lt;span style="color:#006080;"&gt;&amp;quot;Hola Mundo WPF&amp;quot;&lt;/span&gt;);
        }
    }
}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;El código generado es muy parecido, pero podemos ver alguna de las características que hemos estado comentando de WPF. Por ejemplo Window hereda de ContentControl con lo que no tiene una propiedad Controls sino un Content (object) en el que establecemos el botón. El objeto Application en Windows Forms es directamente un singleton, mientras que en WPF tienes que crear una instancia de tu propia aplicación o heredad de esta clase y llamar al método Run, de instancia y no estático como en WF. &lt;/p&gt;

&lt;p&gt;En los siguientes post me centraré en WPF y empezaré a hablar de características especificas de WPF. &lt;/p&gt;

&lt;p&gt;Espero que os guste.&lt;/p&gt;

&lt;p&gt;Luis.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=91797" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/Windows/default.aspx">Windows</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/wpf/default.aspx">wpf</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/win32/default.aspx">win32</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/WPF+-_3E00_+Windows+Forms/default.aspx">WPF -&gt; Windows Forms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windows+forms/default.aspx">windows forms</category></item><item><title>[Curso] WPF para programadores de Windows Forms – Parte 2</title><link>http://geeks.ms/blogs/luisguerrero/archive/2008/07/05/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_Parte_2D00_2.aspx</link><pubDate>Sat, 05 Jul 2008 11:07:03 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:90777</guid><dc:creator>Luis Guerrero</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/rsscomments.aspx?PostID=90777</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://geeks.ms/blogs/luisguerrero/commentapi.aspx?PostID=90777</wfw:comment><comments>http://geeks.ms/blogs/luisguerrero/archive/2008/07/05/Curso_2D00_WPF_2D00_para_2D00_programadores_2D00_de_2D00_Windows_2D00_Forms_2D00_Parte_2D00_2.aspx#comments</comments><description>&lt;p&gt;En el post anterior sobre WPF para programadores de Windows Forms estuvimos hablando de la compatibilidad Hwnd de las dos tecnologías y de cómo estas se integraban perfectamente en Windows. Ahora viene el turno de comparar los objetos de primer nivel que tenemos en Windows Forms y WPF para crear ventanas. Vamos a centrarnos en comparar cuales son los arboles de herencia de las clase Ventana de WF y WPF para así ver cuáles son las diferencias y similitudes que tienen.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="304" alt="image" src="http://geeks.ms/blogs/luisguerrero/WindowsLiveWriter/CursoWPFparaprogramadoresdeWindowsFormsP_121E1/image_6.png" width="304" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;img title="image" style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" height="304" alt="image" src="http://geeks.ms/blogs/luisguerrero/WindowsLiveWriter/CursoWPFparaprogramadoresdeWindowsFormsP_121E1/image_5.png" width="304" border="0" /&gt; &lt;/p&gt;  &lt;p&gt;Si nos fijamos en árbol de herencia de WF, encontramos esto:&lt;/p&gt;  &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;   &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;System.Object
  System.MarshalByRefObject
    System.ComponentModel.Component
      System.Windows.Forms.Control
        System.Windows.Forms.ScrollableControl
          System.Windows.Forms.ContainerControl
            System.Windows.Forms.Form&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;System.Windows.Forms.Form es la clase que representa al formulario, la ventana de WF, esta as u vez hereda de &lt;a title="ContainerControl Class" href="http://msdn2.microsoft.com/e7d2a552.aspx"&gt;ContainerControl&lt;/a&gt; que es una clase que provee funcionalidad específica para la administración de controles que son contenedores de otros controles, como por ejemplo un Panel, esta a su vez hereda de &lt;a title="ScrollableControl Class" href="http://msdn2.microsoft.com/7xhk8yhk.aspx"&gt;ScrollableControl&lt;/a&gt;, clase la cual habilita la funcionalidad de scroll del contenido del control. Ahora llegamos a &lt;a title="Control Class" href="http://msdn2.microsoft.com/36cd312w.aspx"&gt;System.Windows.Forms.Control&lt;/a&gt; que es la clase base de todos los controles de UI de WF y que además maneja el manejador del control (hWnd), tanto la posición del control Location, como el tamaño Size, como los colores, etc.&lt;/p&gt;

&lt;p&gt;Esta clase Control hereda de &lt;a title="Component Class" href="http://msdn2.microsoft.com/9wbadbce.aspx"&gt;System.ComponentModel.Component&lt;/a&gt; que es la primera clase que no está dentro del namespace System.Windows.Forms, esta clase representa los controles o componentes (como su nombre indica) que pueden usarse dentro de la programación de aplicaciones con soporte para interfaz de usuario. Esta clase es importante pues habilita que nuestros componentes o en este caso controles de Windows Forms soporten un tiempo de diseño. Tiempo de diseño como por ejemplo el diseñador de UI de Visual Studio, es importante aclarar esto porque el soporte del diseñador de WF no es de Visual Studio es de .Net Framework, ya que nosotros mismo podemos habilitar un host de diseño para los componentes de la UI y tendríamos las mismas características que Visual Studio nos ofrece para hostear controles de WF. &lt;/p&gt;

&lt;p&gt;Además Component implementa &lt;a title="IComponent Interface" href="http://msdn2.microsoft.com/e4w667z9.aspx"&gt;IComponent&lt;/a&gt; que habilita el soporte para componentes y IDisposable para la recolección de elementos no administrados dentro de la clase. Component hereda de &lt;a title="MarshalByRefObject Class" href="http://msdn2.microsoft.com/w4302s1f.aspx"&gt;MarshalByRefObject&lt;/a&gt;, clase la cual hereda de System.Object. Esta clase, MarshalByRefObject, habilita que los objetos que hereden puedan ser llamados fuera del dominio de aplicación en el que está el objeto, como por ejemplo en las aplicaciones de Remoting y además especifica que la manera de referenciar objetos remotos es a través de referencia. Fijaros que todos los componentes de Windows Forms heredan de esta clase MarshalByRefObject con lo cual tendrían soporte “de serie” para remoting. En lo que nos concierne e Windows Forms, decir que la clase más importante de todos es System.Windows.Forms.Control que es la que habilita que la ventana sea un control al fin y al cabo, pero un control de alto nivel.&lt;/p&gt;

&lt;p&gt;Ahora vamos a ver cuál es el árbol de herencia de una ventana en WPF:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;System.Object
  System.Windows.Threading.DispatcherObject
    System.Windows.DependencyObject
      System.Windows.Media.Visual
        System.Windows.UIElement
          System.Windows.FrameworkElement
            System.Windows.Controls.Control
              System.Windows.Controls.ContentControl
                System.Windows.Window&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;En WPF la clase que representa una ventana es &lt;a title="Window Class" href="http://msdn2.microsoft.com/ms590112.aspx"&gt;System.Windows.Window&lt;/a&gt; y está en el ensamblado PresentationFramework.dll, esta clase hereda de &lt;a title="ContentControl Class" href="http://msdn2.microsoft.com/ms609797.aspx"&gt;System.Windows.Controls.ContentControl&lt;/a&gt; que representa un control de WPF que únicamente tiene un solo hijo o contenido principal, este concepto es muy usado en WPF, un control que únicamente puede contener a otro control. Nosotros en WF tenemos una propiedad Controls que es una lista de todos los controles que contiene ese control, en controles como Panel tiene sentido, pero en Label no tiene sentido tener una lista de controles porque Label no admite más controles hijos, pues bien en WPF todos los controles pueden contener otro control, sin límite y sin excepción. Esto puede resultar algo chocante pero es así, por ejemplo la clase &lt;a title="Label Class" href="http://msdn2.microsoft.com/ms611056.aspx"&gt;System.Windows.Controls.Label&lt;/a&gt; hereda de esta clase con lo que Label tiene una propiedad llamada Content de tipo object en el que nosotros podemos establecer lo que queramos, desde un string, un double, otro Label, un Button, o un MediaElement con un video reproduciéndose. Esto no es como en WF que Label tiene una propiedad Text de tipo string para establecer un texto, en WPF los controles que heredan de ContentControl pueden establecer en su contenido (Content) lo que queramos, incluso una clase de lógica de negocio (esto ya lo veremos más adelante). &lt;/p&gt;

&lt;p&gt;Pero no nos despistemos, ContentControl hereda de System.Windows.Controls.Control que es la clase que representa una UI que una un ControlTemplate para definir su apariencia. ¿Esto qué significa?, pues que la clase Control, tiene una propiedad ControlTemplate para definir el árbol de controles que representa a este control. Ahora justo es el momento para introducir el concepto de XAML. WPF utiliza para definir la interfaz de usuario unos ficheros con extensión .xaml que son básicamente ficheros XML con una estructura jerárquica. Cada nodo de un fichero .xaml representa una clase de WPF y a través de los atributos se establecen las propiedades de la clase, así por ejemplo podemos tener la representación de un Label así &lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Label&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Content&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Nombre&amp;quot;&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Width&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;75&amp;quot;&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;.&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Pues bien esta clase ControlTemplate, es justamente eso la plantilla del árbol de controles del control actual, algo así como:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ControlTemplate&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;TargetType&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Button&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;Ellipse&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;Fill&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;{TemplateBinding Background}&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000;"&gt;ContentPresenter&lt;/span&gt; &lt;span style="color:#ff0000;"&gt;HorizontalAlignment&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;
        &lt;span style="color:#ff0000;"&gt;VerticalAlignment&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;=&amp;quot;Center&amp;quot;&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;Grid&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000;"&gt;ControlTemplate&lt;/span&gt;&lt;span style="color:#0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;Podéis pensar que esta clase System.Windows.Controls.Control es la equivalente a System.Windows.Forms.Control, pero no porque la clase Control de WPF tiene muchas más cosas que la de WF y hay una clase base que tiene más similitudes con las clase Control de WF.&lt;/p&gt;

&lt;p&gt;Llegado a este punto vamos a seguir otro orden explicando el árbol de herencia porque necesitamos explicar demasiados conceptos que hacienda al revés sería mucho más fácil. Así que ahora el orden que vamos a seguir es:&lt;/p&gt;

&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;max-height:200px;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;background-color:#f4f4f4;"&gt;
  &lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, &amp;#39;Courier New&amp;#39;, courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none;"&gt;System.Windows.FrameworkElement 
    System.Windows.UIElement
        System.Windows.Media.Visual
            System.Windows.DependencyObject 
                System.Windows.Threading.DispatcherObject 
                    System.Object&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Vamos a ir desde System.Object hacia System.Windows.FrameworkElement. Empezamos con la clase &lt;a title="DispatcherObject Class" href="http://msdn2.microsoft.com/ms615925.aspx"&gt;System.Windows.Threading.DispatcherObject&lt;/a&gt; que la clase que asocial un objeto con un Dispatcher, ahora bien que es un Dispatcher, vamos primero a repasar un concepto de WF.&lt;/p&gt;

&lt;p&gt;En WF la UI de no es multihilo, eso que significa que si desde un Thread diferente al Thread que creo que control se intenta modificar alguna propiedad del control, es una operación no autorizada un puede lanzar una excepción o el programa hacer cosas extrañas. Eso que significa, que si tengo un control y quiero modificar, por ejemplo, la propiedad Text desde otro Thread, ¿no puedo?. Claro que se puede modificar, pero se tiene que hacer de una manera muy especial, utilizando un método definido en la clase System.Windows.Forms.Control llamado &lt;a title="Control..::.Invoke Method " href="http://msdn2.microsoft.com/30s4t80c.aspx"&gt;Invoke&lt;/a&gt;. Este método invoke nos permite pasarle un delegado, para que ese delegado se ejecute dentro del Thread que creo que control. Invoke es un método de instancia con lo que lo tenemos que llamar desde el control que queremos modificar. Y si yo no se cuando tengo que llamar a este método porque no se estoy en un Thread diferente al que lo creo?, pues tienes la propiedad &lt;a title="Control..::.InvokeRequired Property " href="http://msdn2.microsoft.com/a82t6122.aspx"&gt;InvokeRequired&lt;/a&gt; (bool) que en caso de que sea necesario llamada al método Invoke devolverá true. Pues bien este patrón de llamadas entre hilos para los controles de WF, también está presente en WPF y justamente el Dispatcher es la clase que se encarga de ese cometido. La clase DispatcherObject es la clase que contiene una propiedad llamada Dispatcher que es justamente el que maneja las llamadas entre Threads de los controles de WPF. Esta clase Dispatcher (se llama igual que la propiedad), tiene un método igual que en WF llamado Invoke, pero a diferencia de la propiedad InvokeRequired, aquí para comprobar si el Thread actual es diferente del Thread que creo que control de WPF tenemos el método &lt;a title="Dispatcher..::.CheckAccess Method " href="http://msdn2.microsoft.com/ms591588.aspx"&gt;CheckAccess&lt;/a&gt; que devuelve, ojo, true en caso de que el Thread actual sea el mismo Thread que creó el control y false en otro caso, justo al revés que en WF. Además tenemos &lt;a title="Dispatcher..::.VerifyAccess Method " href="http://msdn2.microsoft.com/ms591602.aspx"&gt;VerifyAccess&lt;/a&gt; que hace lo mismo pero lanza una excepción del tipo InvalidOperationException en caso de que el Thread actual no tenga Dispatcher.&lt;/p&gt;

&lt;p&gt;Como veis son dos conceptos análogos pero están implementados de manera diferente en WF y WPF, tengo un post pendiente de cómo funciona el Invoke de WP porque es bastante interesante hablar sobre ello. &lt;/p&gt;

&lt;p&gt;La siguiente clase de nuestra lista es DependencyObject la cual es un sistema de propiedades dentro de WPF que soportan herencia y se propagan a través del árbol lógico de una aplicación, para que cuando un valor de una propiedad cambie, por ejemplo, en una ventana todos los controles que están en esa ventana sean notificados del cambio. Si cambiamos el color de la letra en una ventana que todos los controles que están dentro de esa ventana sean notificados, esto ahora mismo en WF es posible, pero la característica principal de esto es que nosotros podemos hacer también nuestras propias dependencias. Esto como imaginareis en WF no tiene ninguna equivalencia. &lt;/p&gt;

&lt;p&gt;Y ahora llegamos a System.Windows.Media.Visual una clase muy importante dentro de la UI de WPF. Esta clase provee soporte para dibujado (redering) de la UI, soporte para detención de elementos (hit testing), transformación de coordenadas, recuadrado del contenido. Esta clase es la clase básica para el desarrollo de un control de WPF que tiene soporte para dibujado, y además esta clase tiene soporte para manejador de ventana (hWnd). Las características que tiene son:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Soporte para dibujado &lt;/li&gt;

  &lt;li&gt;Transformaciones de los elementos visuales (rotación, translación, escala, etc) &lt;/li&gt;

  &lt;li&gt;Recorte (Clipping) &lt;/li&gt;

  &lt;li&gt;Prueba de coordenadas (Hit testing) &lt;/li&gt;

  &lt;li&gt;Calculo del recuadro de dibujado &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como veis es un soporte muy básico para el dibujado en pantalla no soporta manejo de eventos, layout, estilos o enlace a datos.&lt;/p&gt;

&lt;p&gt;La clase &lt;a title="UIElement Class" href="http://msdn2.microsoft.com/ms590078.aspx"&gt;System.Windows.UIElement&lt;/a&gt; es el punto de inicio para los controles que soportan los diferentes tipos de layout que hay en WPF. En WF estamos acostumbrados a hacer el layout de los controles a través de la posición del control y el tamaño del objeto (Location(Point), Size(Size)), pues bien en WPF hay varios tipos de layout dependiendo del control actual en que contenedor esté. Para que os hagáis una idea es parecido al layout de una web (html) en la que se puede usar Top, Left, Right, Bottom y se pueden usar grids. Esta clase expone una serie de métodos virtuales que las clases que lo heredan pueden sobreescribir para modificar el comportamiento de layout del control. Además este es el primer control dentro del árbol de herencia que soporta eventos de teclado, ratón y estilos. Todos estos eventos están implementados como “routed events” que son un tipo de eventos de WPF que permiten que se propaguen hacia arriba (bubbling) y hacia abajo (tunneling).&lt;/p&gt;

&lt;p&gt;Esta clase si se puede comparar como un elemento básico de los controles de Win32 y la podemos comparar más con la clase Control de WF, además de poder compararla también con un elemento de DHTML.&lt;/p&gt;

&lt;p&gt;Y llegamos por fin a la clase &lt;a title="FrameworkElement Class" href="http://msdn2.microsoft.com/ms602714.aspx"&gt;FrameworkElement&lt;/a&gt; la cual aglutina todas las características vistas en las clases anteriores y representa el elemento básico de todos los controles o elementos de framework de WPF. FrameworkElement extiendo UIElement y añade estas características:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Define un sistema de layout: FrameworkElement define una serie de métodos virtuales que estaban definidos en UIElement para generar el sistema de layout de los controles, pero define otros métodos para que los controles puedan interactural con ese sistema de layout. Entre los métodos más importantes para el cálculo del layout tenemos, Arrange(Rect final) y Measure(Size size). Arrange posiciona los elementos hijos del control y determina cual es el tamaño en el que los elementos hijos están de manera confortable y Measure los controles hijos calculan cual su tamaño ideal para su dibujado. &lt;/li&gt;

  &lt;li&gt;Define un árbol de controles para que los controles puedan interactuar &lt;/li&gt;

  &lt;li&gt;Define eventos para el ciclo de vida de un objeto. &lt;/li&gt;

  &lt;li&gt;Soporte para enlace a datos &lt;/li&gt;

  &lt;li&gt;Soporte para estilos &lt;/li&gt;

  &lt;li&gt;Soporte para animaciones &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esta parte ha sido un poco más larga, pero hay que tener en cuenta que WPF define mucha más funcionalidad para los controles de la UI que WF. Resumiendo un poco WPF tiene más capas de abstracción para definir la misma funcionalidad que WF y además añade soporte para otras características que en WF no teníamos, como estilos, enlace a datos, layout más complejos, ect. Además de la idea de que un control puede contener a otro control, cosa que en WF no es posible, ahora que tenemos claro cuál es la arquitectura de los controles de WPF, de una manera rápida en el siguiente post vamos a verlo de una manera práctica y con ejemplos concretos de control y ventana. &lt;/p&gt;

&lt;p&gt;Luis. &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://geeks.ms/aggbug.aspx?PostID=90777" width="1" height="1"&gt;</description><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/.net/default.aspx">.net</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/Programaci_26002300_243_3B00_n/default.aspx">Programaci&amp;#243;n</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/wpf/default.aspx">wpf</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windowsforms/default.aspx">windowsforms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/WPF+-_3E00_+Windows+Forms/default.aspx">WPF -&gt; Windows Forms</category><category domain="http://geeks.ms/blogs/luisguerrero/archive/tags/windows+forms/default.aspx">windows forms</category></item></channel></rss>