<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>El Blog de Fox</title>
	<atom:link href="http://blog.foxandxss.net/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.foxandxss.net</link>
	<description>Fomentando el desarrollo y el software libre bajo .NET</description>
	<lastBuildDate>Sun, 20 Dec 2009 13:53:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>TwitFox 1.0</title>
		<link>http://blog.foxandxss.net/index.php/twitfox-1-0/</link>
		<comments>http://blog.foxandxss.net/index.php/twitfox-1-0/#comments</comments>
		<pubDate>Sun, 20 Dec 2009 13:52:01 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVP]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=174</guid>
		<description><![CDATA[Hola!
He creado un cliente de Twitter, es un cliente sencillito que he hecho con el proposito de aprender y de divertirme un poco.
Os dejo una screen:


Mi primera intención era la de crear un artículo explicando paso por paso como crear un cliente Twitter, pero la verdad es que aunque simple el cliente, ha terminado con [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>He creado un cliente de <b>Twitter</b>, es un cliente sencillito que he hecho con el proposito de aprender y de divertirme un poco.</p>
<p>Os dejo una screen:</p>
<p><a href="http://www.foxandxss.net/misprogramas/twitfox/principal.PNG"><img alt="ScreenTwitFox" src="http://www.foxandxss.net/misprogramas/twitfox/principal.PNG" class="alignnone" width="467" height="720" /></a><br />
<span id="more-174"></span></p>
<p>Mi primera intención era la de crear un artículo explicando paso por paso como crear un cliente Twitter, pero la verdad es que aunque simple el cliente, ha terminado con más código del que pensaba.</p>
<p>Aun así os daré algunos detalles para que cuando mirés el código pues sepais más o menos qué hace cada cosa.</p>
<p>No he usado ninguna librería concreta para desarrollar esta primera versión del cliente de Twitter. Simplemente he usado el <b>REST API</b> el cual es bastante limitado.</p>
<p>La clase <i>TwitterClient</i> es la que nos permitirá descargar nuestros Tweets y cambiar nuestro estado. No hace nada más. Cuando cambie la librería, añadiré más opciones a la interfaz de dicha clase sin modificar las opciones que ya hay.</p>
<p>Podeis observar que la clase lo que hace es descargar un XML con los tweets y parsearlos.</p>
<p>Por otro lado, podéis ver que la estructura del proyecto es MVP aunque le he añadido tambien la clase <i>DelegateCommand</i> para usar comandos siempre que sea posible.</p>
<p>Lo más complejo del proyecto es la UI, en la cual he usado <b>Data Templates</b>, <b>Fake DataContext</b> (Dos cosas que habéis aprendido aquí), además de un botón custom con una pequeña animación.</p>
<p>El código de la UI quizá sea un poco guarrete, pero es la primera aplicación que hago usando <b>Blend 3</b> como aplicación de diseño principal.</p>
<p>Nada más, os dejo aquí el enlace a la aplicación:</p>
<p><a href="http://www.foxandxss.net/misprogramas/twitfox/twitfox.php">TwitFox</a></p>
<p>Un saludo!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/twitfox-1-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Patrones de diseño</title>
		<link>http://blog.foxandxss.net/index.php/patrones-de-diseno/</link>
		<comments>http://blog.foxandxss.net/index.php/patrones-de-diseno/#comments</comments>
		<pubDate>Sun, 13 Dec 2009 21:28:40 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=168</guid>
		<description><![CDATA[Hola!
Tengo pensado hacer una serie de artículos sobre patrones de diseño.
Iré colocando al menos un par de veces al mes, un artículo enfocado a un patrón de diseño en concreto. Escribiré el motivo del patrón con un buen ejemplo y sobre el código, en un principio estará escrito enfocado a C#, usando las herramientas de [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Tengo pensado hacer una serie de artículos sobre patrones de diseño.</p>
<p>Iré colocando al menos un par de veces al mes, un artículo enfocado a un patrón de diseño en concreto. Escribiré el motivo del patrón con un buen ejemplo y sobre el código, en un principio estará escrito enfocado a C#, usando las herramientas de las que C# nos provee. Eso si, en caso de que la implementación de C# sea tan tan tan especifica, intentaré proveer de un ejemplo más neutral.</p>
<p>Nada más, a ver si pongo uno esta semana <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Un saludo,<br />
Fox</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/patrones-de-diseno/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Reseña: C# In Depth</title>
		<link>http://blog.foxandxss.net/index.php/resena-c-in-depth/</link>
		<comments>http://blog.foxandxss.net/index.php/resena-c-in-depth/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 18:04:13 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Reseñas]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://blog.foxandxss.net/?p=156</guid>
		<description><![CDATA[¿Eres un programador de Java y quieres aprender C#? ¿O bien conoces lo básico de C# y quieres conocer todo lo que ofrece?
En ambos casos, bienvenidos a C# In Depth, EL libro avanzado de C# por excelencia.


Este libro tiene una finalidad muy concreta, enseñar qué ofrece C# 2 y 3.
Al ser un libro avanzado, necesita [...]]]></description>
			<content:encoded><![CDATA[<p>¿Eres un programador de Java y quieres aprender C#? ¿O bien conoces lo básico de C# y quieres conocer todo lo que ofrece?<br />
En ambos casos, bienvenidos a <b>C# In Depth</b>, <span style="font-size: 2em;">EL</span> libro avanzado de <b>C#</b> por excelencia.</p>
<p><a href="http://www.manning.com/skeet/skeet_cover150.jpg"><img alt="" src="http://www.manning.com/skeet/skeet_cover150.jpg" class="alignnone" width="150" height="189" /></a><br />
<span id="more-156"></span><br />
Este libro tiene una finalidad muy concreta, enseñar qué ofrece C# 2 y 3.<br />
Al ser un libro avanzado, necesita que o bien seáis programadores de Java o bien que conozcáis C# 1 como mínimo.<br />
Como ya he dicho, este libro es maravilla (sí, parece que todos los libros que leo son maravilla, eso o que pierdo mucho tiempo descartando libros para quedarme con uno decente <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), aunque son solo 424 páginas, parecerá que son 2 mil, pues es muy denso.</p>
<p>El libro está dividido en 3 partes, cada una dedicada a las 3 versiones de <b>C#</b> que hay <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><b>Parte 1:</b><br />
Ya he dicho que este libro se centra en la versión 2 y 3 de <b>C#</b>, pero aun así, el autor quiere dedicar un poco de tiempo a hablarnos de lo que nos ofreció C# cuando nació y además de hacernos ver las cosas que se hacían mal en C# 1 y como C# 2 y 3 nos ofrecen una mejor alternativa para esos casos concretos.<br />
Por otro lado, esta parte empieza con lo típico y es que parece que ningún autor es capaz de resistir la tentación de poner la historia de C#, .NET y toda la pesca.<br />
Después de este aburrido capítulo, empieza ya lo interesante.<br />
Nos recordará algunas cosas básicas de C# para posteriormente mostrarnos que esas cosas maravillosas que usábamos, apestan y que ahora tenemos mejores formas de hacerlo. Básicamente lo que el autor quiere aquí es ponerte los dientes largos mostrándote por ejemplo como molan las <i>Lambdas</i>.</p>
<p><b>Parte 2:</b><br />
Ésta parte, titulada “Resolviendo los problemas de C# 1” se centrará en C# 2, el cual tiene jugosas novedades que hará que nuestro código C# sea mucho mejor <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Nos hablará de la necesidad de los genéricos aunque también de sus limitaciones.<br />
También abordará sobre los tipos ‘nullables’, lo cual nos ayudará cuando tratemos con bases de datos.<br />
Veremos cómo implementar mejores delegados gracias a los métodos anónimos.<br />
Un poco de iteradores también y para terminar un conjunto de cosas no menos importantes.</p>
<p><b>Parte 3:</b><br />
Esta parte es igual a la anterior, más features pero esta vez las de C# 3.<br />
Tipos anónimos, inicialización simplificada, lambda, métodos de extensión (extension methods) y sobre todo…. <b>LINQ</b>.<br />
Ahora es cuando os emocionáis como yo y decís, uhm <b>¡LINQ!</b>. Después de más de 300 páginas leídas, viene quizá lo más interesante.<br />
Siento desilusionaros, porque para mí, este es el punto flojo del libro. ¿Por qué? Intenta en poco menos de 100 páginas, explicarnos todo LINQ to Objects, SQL, XML, DataSet pero intenta hacerlo de forma muy bruta ya que intenta meterte ahí con calzador toda la teoría detrás de <b>LINQ</b> la cual no es fácil de digerir.<br />
Yo entiendo que en 100 páginas no se puede explicar todo LINQ, pero yo lo habría dejado en una explicación básica o directamente lo hubiese sacado del libro.<br />
Para aprender <b>LINQ</b> hay otro libro de esta misma casa que ya reseñaré más adelante.</p>
<p><b>Conclusión:</b><br />
En conclusión, este libro es la mejor manera para llegar a dominar lo que se dice TODO <b>C#</b>, eso sí, es aburridísimo como habréis podido notar de mi reseña… No deja de ser escupir features una tras otra sin cesar. Aun así, lo hace una forma magistral, fácil de entender y sobretodo fácil de digerir.</p>
<p>Sin más preámbulos:</p>
<p><b>Positivo:</b></p>
<ul>
<li>Nos hace ver lo que hacemos mal y cómo mejorarlo.</li>
<li>Explica todas las features del lenguaje en su versión 2 y 3.</li>
<li>Los ejemplos de código, aunque de juguete, son muy claros.</li>
<li>No deja nada sin explicar, tiene respuesta a todo.</li>
</ul>
<p><b>Negativo:</b></p>
<ul>
<li>La parte de LINQ, sobraba, muy difícil de asimilar.</li>
<li>Algunas partes muy concretas son duras y difíciles de entender (Lease expression trees).</li>
</ul>
<p>La nota será de <b>9.8</b>. Le habría dado más puntos si hubiese quitado la parte de LINQ, puesto que solo hace confundir, y ya lo hubiese rematado si hubiese encontrado una forma de explicar los ‘Expression trees’ de una forma entendible.<br />
Si os termináis de leer este libro, probablemente el próximo a la cola sería el de <b>Linq In Action</b>, ya que explica <b>LINQ</b> de forma magistral y hasta los ‘Expression trees’ los explica bien jeje.</p>
<p>Bueno, os dejo el enlace a la página oficial del libro:</p>
<p><a href="http://www.manning.com/skeet/">Link</a></p>
<p>Un saludo,<br />
Fox</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/resena-c-in-depth/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[WPF] Datos en tiempo de diseño (Design-time DataContext)</title>
		<link>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/</link>
		<comments>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 15:13:22 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Blend]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.net/?p=125</guid>
		<description><![CDATA[¡Hola!
Para seguir este artículo necesitaréis de Microsoft Expression Blend 3 o Visual Studio 2010 Beta 2. Además necesitaréis una copia del proyecto del artículo &#8220;Data Templates&#8220;.
Antes de explicaros qué significa exactamente eso de Datos en tiempo de diseño quiero que veais el problema en vuestras carnes y así buscarle una solución idónea.
Yo usaré Blend 3 [...]]]></description>
			<content:encoded><![CDATA[<p>¡Hola!</p>
<p>Para seguir este artículo necesitaréis de <b>Microsoft Expression Blend 3</b> o <b>Visual Studio 2010 Beta 2</b>. Además necesitaréis una copia del proyecto del artículo &#8220;<a href="http://www.foxandxss.net/index.php/2009/08/wpf-data-templates/">Data Templates</a>&#8220;.</p>
<p>Antes de explicaros qué significa exactamente eso de <i>Datos en tiempo de diseño</i> quiero que veais el problema en vuestras carnes y así buscarle una solución idónea.</p>
<p>Yo usaré <b>Blend 3</b> así que las imágenes y las instrucciones serán usando este soft, pero se pueden aplicar con Visual Studio 2010 sin ningún problema.</p>
<p>Imaginad esta situación:</p>
<p>Queréis modificar el <i>Data Template</i> que habíamos creado del ejemplo citado. No sé, el borde ese verde que tiene cada item no os gusta y queréis ir probando colores hasta encontrar uno que os guste más. Ningún problema, abres el proyecto con el <b>Blend 3</b> y&#8230;.<br />
<span id="more-125"></span><br />
<a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/1.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/1.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Vaya tela, nos sale una bonita ventana en blanco&#8230; ¿Por qué no sale el contenido? No nos sale porque ni Blend ni Visual studio ni nadie sabe qué ha de representar ahí, o mejor dicho, nosotros estamos <i>&#8216;bindeando&#8217;</i> ese contenido a una propiedad del DataContext, o sea del ViewModel. Blend no sabe nada sobre ese DataContext que hemos establecido en código, así que el no sabe que ha de mostrar ahi ni nada. Si bien sabe como dibujar el Data Template, no sabe qué <i>&#8216;Data&#8217;</i> tiene que reprentar ahi.</p>
<p>Entonces con <b>Blend 3</b> llegó una nueva cosita llamada <i>Datos en tiempo de diseño</i>, o lo que es lo mismo, ofrecerle unos datos <i>&#8216;de mentira&#8217;</i> a <b>Blend 3</b> a fin de que los use para dibujar los Data Template en la ventana.</p>
<p>¿Qué quiero decir con eso de ofrecerle unos datos de mentira? Fácil, el <i>ItemsControl</i> está asociado a una lista llamada <i>ListaPersonas</i>, pero dicha lista &#8216;viene&#8217; del <i>DataContext</i> y como ya os he dicho, el editor visual no puede mostrar nada que venga de ahi, por eso nos aparece la ventana en blanco, porque ignora el DataContext.</p>
<p>Aquí es donde entra el <i>Datos en tiempo de diseño</i> (Design-time Data). es digamos un <i>DataContext</i> especial sólo para diseñar, así podemos mostrar datos &#8216;Fake&#8217; y ver como quedaría sin ejecutar la aplicación ni nada. Por ejemplo:</p>
<p>Imaginad que estais haciendo una aplicación de Twitter. Cuando la aplicación se conecta a la red, descarga tus tweets, y crea una instancia de la clase <i>Tweet</i> por cada tweet que recoja. ¿Cómo diseñarías la ventana principal del programa? ¿Creas un no sé, <i>ItemsControl</i> y creas un DataTemplate para los Tweet? Es una idea, pero es un coñazo, tienes que crear un template, abrir el programa, conectarte a tu Twitter, que descargue tus Tweets y ver que&#8230; oh mierda, ese borde no moooola nada. Cierras la aplicación, modifica el borde y otra vez a probarlo. Si tienes que hacer eso 50 veces para dejar el estilo a tu gusto, mueres.</p>
<p>¿Qué hacer entonces? Creas una clase llamada&#8230; FakeTweets por ejemplo que herede de la clase que usa tu ventana de DataContext, ahí instancias la lista del datacontext, creas unos cuantos tweets de mentira y usas la técnica que explicaré a continuación <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Este ejemplo es algo muy común, porque donde dices Twitter, dices aplicación de msn y su ventana de contactos, etc.</p>
<p>Vamos a nuestra aplicación que ya está abierta en Blend, y añadimos lo siguiente dentro del <i>Tag</i> de la ventana&#8230;</p>
<pre class="brush: xml;">
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
xmlns:local=&quot;clr-namespace:DataTemplates&quot;
mc:Ignorable=&quot;d&quot;
</pre>
<p>Con lo que quedaría así:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
	xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
	xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
    xmlns:local=&quot;clr-namespace:DataTemplates&quot;
	mc:Ignorable=&quot;d&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;
    Background=&quot;#f8fffb&quot;&gt;
</pre>
<p>Voy a detallar para qué sirve cada uno:</p>
<pre class="brush: xml;">
xmlns:d=&quot;http://schemas.microsoft.com/expression/blend/2008&quot;
xmlns:mc=&quot;http://schemas.openxmlformats.org/markup-compatibility/2006&quot;
xmlns:local=&quot;clr-namespace:DataTemplates&quot;
</pre>
<p>Los 3 son namespace como podeis ver, cada uno con una idea en mente.</p>
<p>El primero es el que añade todo el tema de <i>Datos en tiempo de diseño</i>.<br />
El tercero es para importar el namespace de nuestra aplicación (luego veremos por qué)<br />
El segundo va en conjunto con:</p>
<pre class="brush: xml;">
mc:Ignorable=&quot;d&quot;
</pre>
<p>El namespace &#8216;mc&#8217; que hemos importando antes nos sirve para usar el <i>Ignorable</i>. ¿Para qué sirve esto? Sirve para excluir todo lo que sea del namespace indicado a la hora de compilar. ¿Por qué ignoramos el namespace &#8216;d&#8217;? Porque lo que nos ofrece son cosas que nos facilitan la vida a la hora de diseñar la aplicación, pero que a la hora de ejecutarla ya no nos sirve. Así que la aplicación compilada no contendrá nada de lo que coloquemos de cara a ayudarnos a diseñar.</p>
<p>¿Y ahora qué? Ahora tenemos que cargar en el XAML la clase con los datos &#8216;fake&#8217; (como por ejemplo la clase con tweets de mentira), en nuestro caso nos basta con cargar el <i>Presenter</i> ya que trae datos de ejemplos que nos servirá para el caso.</p>
<p>Para esto podemos usar por ejemplo un <i>ObjectDataProvider</i>:</p>
<pre class="brush: xml;">
&lt;Window.Resources&gt;
	&lt;ObjectDataProvider ObjectType=&quot;{x:Type local:Presenter}&quot; x:Key=&quot;FakeVM&quot; /&gt;
&lt;/Window.Resources&gt;
</pre>
<p>Como ves, he cargado el Presenter (usando el namespace <i>local</i> que cargué antes) y le he dado el nombre de <i>FakeVM</i>.</p>
<p>Ya solo nos quedaría cargar dicho objeto dentro del <i>Data Context</i> en tiempo de diseño, el cual está en el namcespace &#8216;d&#8217;.</p>
<p>En nuestro ejemplo, se lo asignaremos al <i>ItemsControl</i> como era de esperar:</p>
<pre class="brush: xml;">
&lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot; d:DataContext=&quot;{StaticResource FakeVM}&quot;&gt;
</pre>
<blockquote><p>NOTA: El método que he descrito aquí, inclusive los namespaces de blend, sirve tanto para <b>Blend 3</b> como para <b>Visual Studio 2010</b> (Beta 2 en adelante)</p></blockquote>
<p>ahora, si vamos al modo diseño&#8230;</p>
<p><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/2.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/2.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Ya se ve!! Pero dirás&#8230; ¿Y ahora qué? ¿Puedo modificar el template en modo diseño y en ver los resultados en tiempo real? Claro que sí!</p>
<p>En <b>Blend 3</b>, abajo a la izquierda nos aparecerá el arbol de objetos de nuestra aplicación:</p>
<div class="wp-caption alignnone" style="width: 293px"><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/3.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/3.png" width="283" height="158" /></a><p class="wp-caption-text">Screenshot</p></div>
<p>Ahi hacemos click derecho en ItemsControl y luego <i>Edit Aditional Templates -> Edit Generated Items (ItemTemplate) -> Edit Current</i>. Al hacer esto vemos como se señala el primer objeto del <i>ItemsControl</i> (ya que realmente editando uno, cambian todos).</p>
<p>Ya solo nos queda hacer los cambios pertinentes, por ejemplo cambiando el borde de cada objeto por uno con gradiente Negro <-> Blanco. Comprobareis con alegría que mientras moveis el cursor en la paleta de colores, el resultado se va viendo en tiempo real, y no necesitaréis ejecutar la aplicación con cada cambio.</p>
<p><a href="http://www.foxandxss.net/CosasBlog/FakeDataContext/4.png"><img alt="Screenshot" src="http://www.foxandxss.net/CosasBlog/FakeDataContext/4.png" title="Imagen 1" class="alignnone" width="485" height="484" /></a></p>
<p>Así que en resumen, teneis una manera de poder diseñar los <i>Data Templates</i> de forma visual usando datos &#8216;fake&#8217; y que no afectará para nada a la aplicación compilada.</p>
<p>Espero vuestros comentarios <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/datos-en-tiempo-de-diseno-design-datacontext/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nueva versión de Apunta Notas 2</title>
		<link>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/</link>
		<comments>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 21:27:35 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=109</guid>
		<description><![CDATA[Hola!
Siento no escribir tanto como me gustaría, pero estuve de exámenes hace poco, y ahora he empezado a trabajar.
Bueno, antes de dichos exámenes escribí una nueva versión del Apunta Notas y la anucio por aquí para que la probeis.
Dicha versión tiene:


Ahora al borrar una categoría te da la opción de borrar todas las notas asociadas [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!</p>
<p>Siento no escribir tanto como me gustaría, pero estuve de exámenes hace poco, y ahora he empezado a trabajar.</p>
<p>Bueno, antes de dichos exámenes escribí una nueva versión del Apunta Notas y la anucio por aquí para que la probeis.</p>
<p>Dicha versión tiene:<br />
<span id="more-109"></span></p>
<ul>
<li>Ahora al borrar una categoría te da la opción de borrar todas las notas asociadas a ella.</li>
<li>Si decides no borrar dichas notas, se enviarán a una categoría oculta llamada &#8220;Papelera&#8221;.</li>
<li>Ahora al pulsar intro se añadirá la nota automaticamente (antes no me funcionaba por un pequeño bug que no veía)</li>
<li>Los rectangulos de los colores también son botones para seleccionar el color</li>
<li>Algun bug solucionado</li>
</ul>
<p>Quizá se me olvide algo, pero ahora no caigo, realmente metí muchas mejoras a lo largo de 2 dias de trabajo con el.</p>
<p>Los enlaces están donde siempre <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A ver si este fin de semana puedo hacer algo más interesante.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/nueva-version-de-apunta-notas-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apunta notas 2</title>
		<link>http://blog.foxandxss.net/index.php/apunta-notas-2/</link>
		<comments>http://blog.foxandxss.net/index.php/apunta-notas-2/#comments</comments>
		<pubDate>Sat, 22 Aug 2009 17:24:08 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Mis Programas]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[MVVM]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=105</guid>
		<description><![CDATA[¿Os acordais del Apunta notas? Seguro que sí  
Pues aquí estoy orgulloso de presentaros la nueva versión de mi programa de notas. Como veréis a continuación, el cambio es significativo:


Como podéis ver, ahora soporta distintas categorías y estas, distintos colores.
No sólo eso, si no que además podeis ampliar el tamaño de las notas por [...]]]></description>
			<content:encoded><![CDATA[<p>¿Os acordais del <a href="http://blog.foxandxss.net/index.php/apunta-notas/">Apunta notas</a>? Seguro que sí <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pues aquí estoy orgulloso de presentaros la nueva versión de mi programa de notas. Como veréis a continuación, el cambio es significativo:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/CapturaPrincipal-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/CapturaPrincipal-post.png" alt="" width="485" height="364" /></a></p>
<p><span id="more-105"></span></p>
<p>Como podéis ver, ahora soporta distintas categorías y estas, distintos colores.</p>
<p>No sólo eso, si no que además podeis ampliar el tamaño de las notas por si quereis verla desde lejos del monitor[1]:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/zoom-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/zoom-post.png" alt="" width="485" height="364" /></a></p>
<p>También tiene un editor de categorías donde podrás modificar todos los apartados de éstas como podéis ver aquí:</p>
<p><a href="http://www.foxandxss.net/misprogramas/apuntanotas2/Categorias-post.png"><img class="alignnone" src="http://www.foxandxss.net/misprogramas/apuntanotas2/Categorias-post.png" alt="" width="485" height="541" /></a></p>
<p>Como veis, podeis cambiar el nombre, color de fondo, color de texto&#8230; y además podéis ver una vista prévia de la nota para ver como quedará.</p>
<p>Para más detalles y descarga podéis visitar la página de <a title="Apunta Notas 2" href="http://www.foxandxss.net/misprogramas/apuntanotas2/apuntanotas.php">Apunta Notas 2</a>.</p>
<p>[1]: Yo personalmente apunto las cosas que le quiero comentar a mi novia y cuando la llamo me tumbo en la cama, así que pongo las notas bien grandecitas y así las veo desde allí <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/apunta-notas-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>[WPF] Data Templates</title>
		<link>http://blog.foxandxss.net/index.php/wpf-data-templates/</link>
		<comments>http://blog.foxandxss.net/index.php/wpf-data-templates/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 21:07:05 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=92</guid>
		<description><![CDATA[Hola buenas!
Estáis deseosos de aprender más maravillas de WPF, ¿verdad? Pues nada, aquí os traigo algo muy util que os podría venir bien para vuestros propios desarrollos.
Empezamos con la gran pregunta:

¿Qué son los Data Templates?
Imagina que tienes una clase llamada Persona, Animales, etc. y queréis representar instancias de dichas clases visualmente en vuestro programa, el [...]]]></description>
			<content:encoded><![CDATA[<p>Hola buenas!</p>
<p>Estáis deseosos de aprender más maravillas de <b>WPF</b>, ¿verdad? Pues nada, aquí os traigo algo muy util que os podría venir bien para vuestros propios desarrollos.</p>
<p>Empezamos con la gran pregunta:<br />
<span id="more-92"></span></p>
<h2>¿Qué son los Data Templates?</h2>
<p>Imagina que tienes una clase llamada Persona, Animales, etc. y queréis representar instancias de dichas clases visualmente en vuestro programa, el problema como ya sabes es que dichas clases no tienen ninguna representación visual, con lo cual el resultado de ligar una instancia (o una lista de instancias) a un control como por ejemplo un ItemsControl sería el de llamar al método ToString de la instancia lo que nos da un resultado pésimo.</p>
<p>¿Qué podemos al respecto? Pues lo que estabas pensando si, usar <b>Data Templates</b>.</p>
<h2>¡Al turrón!</h2>
<p>Creamos un nuevo proyecto llamado <b>Data Templates</b> y creamos una clase llamada <i>Personas</i>, dicha clase contendrá este código:</p>
<pre class="brush: csharp;">
public class Persona
{
    public string Nombre {get; set; }
    public string Direccion { get; set; }
    public string Telefono { get; set; }
    public int Edad { get; set; }
    public string Sexo { get; set; }
    public string UrlImagen { get; set; }
    public string Color { get; set; }

    public Persona(string nombre, string direccion, string telefono,
                    int edad, string sexo)
    {
        Nombre = nombre;
        Direccion = direccion;
        Telefono = telefono;
        Edad = edad;
        Sexo = sexo;

        if (Sexo.Equals(&quot;Hombre&quot;))
        {
            Color = &quot;#bcebf9&quot;;
            UrlImagen = &quot;Imagenes\\hombre.png&quot;;
        }
        else
        {
            Color = &quot;#f8c2cd&quot;;
            UrlImagen = &quot;Imagenes\\mujer.png&quot;;
        }
    }

    public override string ToString()
    {
        return string.Format(&quot;Hola me llamo {0}, vivo en {1}, mi telefono es {2}, tengo {3} años y soy {4}&quot;, Nombre, Direccion, Telefono, Edad, Sexo);
    }
}
</pre>
<p>Nada aquí que os vaya a sorprender, una clase Persona, que aunque bastante mejorable, va de sobra para nuestro ejemplo. Puntualizo un par de cosas:</p>
<p>Ignorad por ahora el tema de las imagenes y el color, eso se usará más adelante (también meteremos las imagenes más adelante en el proyecto)<br />
El método ToString solo es para ver como quedaría la cosa sin Data Templates y luego se borrará.</p>
<p>Ahora creamos una clase llamada <i>Presenter</i> y le añadimos el siguiente código:</p>
<pre class="brush: csharp;">
class Presenter
{
    private List&lt;Persona&gt; listaPersonas;

    public Presenter()
    {
        listaPersonas = new List&lt;Persona&gt;();

        listaPersonas.Add(new Persona(&quot;Jesus&quot;, &quot;Calle 13&quot;, &quot;132456789&quot;, 23, &quot;Hombre&quot;));
        listaPersonas.Add(new Persona(&quot;Rosi&quot;, &quot;Big street 15&quot;, &quot;987654321&quot;, 27, &quot;Mujer&quot;));
        listaPersonas.Add(new Persona(&quot;Álvaro&quot;, &quot;To lejos street&quot;, &quot;147258369&quot;, 24, &quot;Hombre&quot;));
    }

    public List&lt;Persona&gt; ListaPersonas
    {
        get { return listaPersonas; }
        set { listaPersonas = value; }
    }
}
</pre>
<p>Una clase normal y corriente, simplemente creamos una lista de personas y añadimos algunos ejemplos de personas.</p>
<p>Ahora abrimos el code-behind de la ventana (<i>Windows1.xaml</i>) y modificamos el constructor para que quede de esta manera:</p>
<pre class="brush: csharp;">
public Window1()
{
    InitializeComponent();
    DataContext = new Presenter();
}
</pre>
<p>Y ahora, abrimos la ventana en sí y colocamos este markup:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;&gt;
    &lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;

    &lt;/ItemsControl&gt;
&lt;/Window&gt;
</pre>
<p>Aquí simplemente añadimos un ItemsControl vacío al que le ligamos la lista que hemos creado anteriormente.</p>
<p>Ahora ejecutamos la aplicación y vemos el resultado:</p>
<p><a href="http://www.foxandxss.net/CosasBlog/datatemplates/1.PNG"><img alt="" src="http://www.foxandxss.net/CosasBlog/datatemplates/1.PNG" class="alignnone" width="600" height="600" /></a></p>
<p>Como podeis ver, apesta, es lo más cutre &#8220;ever seen&#8221;, así que vamos a arreglarlo usando los Data Templates.</p>
<p>Antes que nada, me gustaría explicar una cosilla para que no os lieis tanto:</p>
<p>Hay 2 clases bases para los controles, por un lado tenemos la clase <b>ContentControl</b> de la cual heredarán aquellos controles que solo tienen una pieza de contenido, como <b>button</b>, <b>Label</b>, etc.<br />
Por otro lado tenemos la clase <b>ItemsControl</b> de la cual heredarán aquellos controles que muestran una colección de items, como <b>TreeView</b>, <b>ListBox</b>, etc.</p>
<p>Si con la funcionalidad básica que nos ofrecen dichas clases bases vamos bien, no tenemos por qué usar ninguna hija, y en este caso como habeis visto, hemos usado simplemente un ItemsControl pues es todo lo que necesitamos.</p>
<p>Bueno, al grano, si queremos usar los Data Templates, lo unico que debemos hacer es decirle al control, en este caso el ItemsControl, que vamos a definir el aspecto de cada item del control, ¿Cómo? Así:</p>
<pre class="brush: xml;">
&lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;
    &lt;ItemsControl.ItemTemplate&gt;
		&lt;DataTemplate&gt;
			...
		&lt;/DataTemplate&gt;
	&lt;/ItemsControl.ItemTemplate&gt;
&lt;/ItemsControl&gt;
</pre>
<p>Ahí, donde están los puntos suspensivos pues añadimos todo el <b>xaml</b> necesario para lograr el aspecto que queramos. Recordad que estamos definiendo el aspecto de UN solo item y no de toda la colección a la vez, así que ahi escribimos como queremos que se vea cada item y ya se aplicará para todos los items de la lista.</p>
<p>Así que sabiendo esto, vamos a modificar nuestro ejemplo.</p>
<p>Para empezar, puedes borrar el ToString de la clase Personas que ya no nos vale, una vez hecho esto, creamos el directorio <i>Imagenes</i> dentro del proyecto y ahi metemos las dos imágenes que voy a adjuntar a continuación (boton derecho -> guardar como):</p>
<p>[Imagen hombre]</p>
<p>[Imagen mujer]</p>
<p>Ya lo único que nos queda es modificar el ItemsControl añadiendole el template de cómo queremos que se represente cada instancia de la clase.</p>
<p>El código de la ventana quedaría así:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;DataTemplates.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Data Templates&quot; Height=&quot;600&quot; Width=&quot;600&quot;
    Background=&quot;#f8fffb&quot;&gt;
    &lt;ItemsControl ItemsSource=&quot;{Binding ListaPersonas}&quot;&gt;
        &lt;ItemsControl.ItemTemplate&gt;
            &lt;DataTemplate&gt;
                &lt;Border BorderBrush=&quot;#4f9d70&quot; BorderThickness=&quot;2&quot;
                        Margin=&quot;5&quot; Padding=&quot;2.5&quot;&gt;
                    &lt;Grid Background=&quot;{Binding Color}&quot;&gt;
                        &lt;Grid.ColumnDefinitions&gt;
                            &lt;ColumnDefinition Width=&quot;auto&quot; /&gt;
                            &lt;ColumnDefinition Width=&quot;auto&quot; /&gt;
                            &lt;ColumnDefinition Width=&quot;*&quot; /&gt;
                        &lt;/Grid.ColumnDefinitions&gt;
                        &lt;Grid.RowDefinitions&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
                        &lt;/Grid.RowDefinitions&gt;
                        &lt;Border BorderBrush=&quot;#4f9d70&quot;  BorderThickness=&quot;1&quot;
                                Margin=&quot;2.5&quot; Grid.RowSpan=&quot;4&quot;&gt;
                            &lt;Image Source=&quot;{Binding UrlImagen}&quot; /&gt;
                        &lt;/Border&gt;
                        &lt;TextBlock Text=&quot;Nombre: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Nombre}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; /&gt;

                        &lt;TextBlock Text=&quot;Dirección: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;1&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Direccion}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;1&quot; /&gt;

                        &lt;TextBlock Text=&quot;Teléfono: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;2&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Telefono}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;2&quot; /&gt;

                        &lt;TextBlock Text=&quot;Edad: &quot; FontSize=&quot;20&quot; FontWeight=&quot;Bold&quot; Grid.Column=&quot;1&quot; Grid.Row=&quot;3&quot; /&gt;
                        &lt;TextBlock Text=&quot;{Binding Edad}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; Grid.Row=&quot;3&quot; /&gt;
                    &lt;/Grid&gt;
                &lt;/Border&gt;
            &lt;/DataTemplate&gt;
        &lt;/ItemsControl.ItemTemplate&gt;
    &lt;/ItemsControl&gt;
&lt;/Window&gt;
</pre>
<p>Bueno, aunque os de miedo al principio, el código es bastante facilón.</p>
<p>Añadimos un borde y dentro pues un grid y dentro de dicho grid colocamos los controles para representar los datos.</p>
<p>Aquí muy importante decir, que el <b>DataContext</b> dentro del DataTemplate será la instancia del objeto con el que estamos tratando, así que por ejemplo:</p>
<pre class="brush: xml;">
&lt;TextBlock Text=&quot;{Binding Nombre}&quot; FontSize=&quot;20&quot; Grid.Column=&quot;2&quot; /&gt;
</pre>
<p>Aqui con <i>Nombre</i> no nos estamos refiriendo a una propiedad llamada Nombre dentro de Presenter (el DataContext de la ventana), si no a la propiedad Nombre de las instancias de Persona que tiene la lista.</p>
<p>Ahora estáis viendo el uso que le doy a la propiedad <i>Color</i> dentro de la clase Persona, lo uso para definir el color de fondo del item. Sé que no debería añadir esta propiedad dentro de la clase, pero lo hago con motivos ilustrativos simplemente.</p>
<p>Creo que aquí no hay más nada que requiera de una explicación, aunque si os dejaré una screenshot para aquellos que no estén escribiendo el ejemplo en sus ordenadores.</p>
<p><a href="http://www.foxandxss.net/CosasBlog/datatemplates/2.PNG"><img alt="" src="http://www.foxandxss.net/CosasBlog/datatemplates/2.PNG" class="alignnone" width="600" height="502" /></a>	</p>
<p>Bueno, creo que no se me olvida nada, ahora solo queda esperar vuestros comentarios para ver que os ha parecido el artículo.</p>
<p>Os adjunto el proyecto : <a href="http://www.foxandxss.net/CosasBlog/datatemplates/DataTemplates.rar">DataTemplates.rar</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/wpf-data-templates/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Silverlight &amp; HTML &amp; Apache</title>
		<link>http://blog.foxandxss.net/index.php/silverlight-html-apache/</link>
		<comments>http://blog.foxandxss.net/index.php/silverlight-html-apache/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 13:56:26 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=66</guid>
		<description><![CDATA[Buenas!
Mucha gente piensa, de hecho, yo también lo pensaba en su día, que para poder usar Silverlight necesitaríamos un servidor Windows corriendo IIS y una aplicación web usando ASP.NET.
Investigando descubrí que podía embeber una aplicación Silverlight dentro de un simple HTML. Gracias a esto, podemos embeber dicha aplicación en cualquier tipo de página, ya sea [...]]]></description>
			<content:encoded><![CDATA[<p>Buenas!</p>
<p>Mucha gente piensa, de hecho, yo también lo pensaba en su día, que para poder usar <b>Silverlight</b> necesitaríamos un servidor Windows corriendo <b>IIS</b> y una aplicación web usando <b>ASP.NET</b>.</p>
<p>Investigando descubrí que podía embeber una aplicación <b>Silverlight</b> dentro de un simple HTML. Gracias a esto, podemos embeber dicha aplicación en cualquier tipo de página, ya sea PHP u otra cosa.</p>
<p>No solo eso, si no que podemos correr dicha página web bajo un servidor Apache ya sea en Windows o Linux. Ahora te surgirán las dos típicas preguntas: <i>¿Cómo?, ¿Por qué funciona?</i>. Paso a contestarlas:<br />
<span id="more-66"></span></p>
<h2> ¿Por qué funciona en algo que no sea Windows e IIS? </h2>
<p><b>Silverlight</b> no se ejecuta en el servidor, <b>Silverlight</b> se ejecuta en el cliente, es un plugin del navegador, así que somos nosotros quienes necesitamos tener <b>Silverlight</b> instalado.</p>
<p>Así que al ser nosotros quienes ejecutemos la aplicación, el servidor simplemente necesita conocer los ficheros de <b>Silverlight</b> y nada más.</p>
<h2> ¿Cómo lo hago? </h2>
<p>Tendremos que modificar el fichero .htaccess e insertar estos MimeTypes:</p>
<blockquote><p>
AddType application/x-silverlight-app xap<br />
AddType application/x-silverlight-2 xap
</p></blockquote>
<p>Realmente con uno nada más funciona, pero mejor insertamos ambos y nos quitamos de tener que editar luego el html para cambiar el MimeType.</p>
<p>Y bueno, ya que estamos, podriamos insertar todos estos:</p>
<blockquote><p>
AddType application/x-ms-application application<br />
AddType application/x-ms-manifest manifest<br />
AddType application/octet-stream deploy<br />
AddType application/vnd.ms-xpsdocument xps<br />
AddType application/xaml+xml xaml<br />
AddType application/x-ms-xbap xbap<br />
AddType application/x-silverlight-app xap<br />
AddType application/x-silverlight-2 xap
</p></blockquote>
<p>Con todos estos, podremos hacer uso del ClickOnce que nos ofrece el Visual Studio para distribuir nuestras aplicaciones de forma más comoda, en este caso, desde nuestra web.</p>
<p>Y nada más, con esto ya podemos usar alojar nuestra aplicación <b>Silverlight</b> en un servidor Linux con Apache.</p>
<h2> Vale, y&#8230; ¿Ahora como incrusto la aplicación en el HTML? </h2>
<p>Más facil todavía.</p>
<p>Si creamos una aplicación <b>Silverlight</b> en el Visual Studio, nos dará la opción de crear un proyecto <b>ASP.NET</b>, pero si le decimos que no, nos creará un .html básico con el objeto ya embebido.</p>
<p>Básicamente, al compilar una aplicación <b>Silverlight</b>, se creará un fichero .xap que no es más que un .zip que contiene los ficheros .xaml, los dll necesarios&#8230; Vamos, algo parecido a los .jar de Java.</p>
<p>Ahora con este .xap, solo necesitaremos embeberlo en el .html usando un código como este:</p>
<pre class="brush: xml;">
&lt;div id=&quot;silverlightControlHost&quot;&gt;
	&lt;object data=&quot;data:application/x-silverlight-2,&quot; type=&quot;application/x-silverlight-2&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
	  &lt;param name=&quot;source&quot; value=&quot;NombreDel.xap&quot;/&gt;
	  &lt;param name=&quot;background&quot; value=&quot;white&quot; /&gt;
	  &lt;param name=&quot;minRuntimeVersion&quot; value=&quot;3.0.40624.0&quot; /&gt;
	  &lt;param name=&quot;autoUpgrade&quot; value=&quot;true&quot; /&gt;
	  &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0&quot; style=&quot;text-decoration:none&quot;&gt;
		  &lt;img src=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot; alt=&quot;Get Microsoft Silverlight&quot; style=&quot;border-style:none&quot;/&gt;
	  &lt;/a&gt;
	&lt;/object&gt;
&lt;/div&gt;
</pre>
<p>Con esto, dentro de ese div tendremos nuestra aplicación <b>Silverlight</b> embebida.</p>
<p>Esto sería un ejemplo completo de página HTML que contiene simplemente el <b>Silverlight</b>.</p>
<pre class="brush: xml;">
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; &gt;
&lt;head&gt;
    &lt;title&gt;SilverlightApplication1&lt;/title&gt;
    &lt;style type=&quot;text/css&quot;&gt;
		#silverlightControlHost {
			height: 500px;
			width: 500px
		}
    &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;div id=&quot;silverlightControlHost&quot;&gt;
	&lt;object data=&quot;data:application/x-silverlight-2,&quot; type=&quot;application/x-silverlight-2&quot; width=&quot;100%&quot; height=&quot;100%&quot;&gt;
	  &lt;param name=&quot;source&quot; value=&quot;NombreDel.xap&quot;/&gt;
	  &lt;param name=&quot;background&quot; value=&quot;white&quot; /&gt;
	  &lt;param name=&quot;minRuntimeVersion&quot; value=&quot;3.0.40624.0&quot; /&gt;
	  &lt;param name=&quot;autoUpgrade&quot; value=&quot;true&quot; /&gt;
	  &lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=3.0.40624.0&quot; style=&quot;text-decoration:none&quot;&gt;
		  &lt;img src=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot; alt=&quot;Get Microsoft Silverlight&quot; style=&quot;border-style:none&quot;/&gt;
	  &lt;/a&gt;
	&lt;/object&gt;
&lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Con el CSS ajusto el tamaño de la aplicación <b>Silverlight</b>. Imagino que no será la mejor forma para hacerlo, pero todavía estoy verde con la programación web <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<h2> Ejemplo de aplicación <b>Silverlight</b> embebida aquí en el artículo </h2>
<p><div id="silverlightControlHost"><object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="500" height="300"><param name="source" value="http://foxandxss.net/CosasBlog/silverlighthtml/SilverlightClock.xap"/><param name="background" value="white" /><param name="minRuntimeVersion" value="3.0.40723.0" /><param name="autoupgrade" value="true" /><param name="enableHtmlAccess" value="true" /><a href="http://go.microsoft.com/fwlink/?LinkID=149156" style="text-decoration: none;"><img src="http://storage.timheuer.com/sl4wp-ph.png" alt="Install Microsoft Silverlight" style="border-style: none; width:400px; height:200px"/></a></object><iframe style="visibility:hidden;height:0;width:0;border:0px" id="_sl_historyFrame"></iframe></div><br /></p>
<p>Eso es todo amigos.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/silverlight-html-apache/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>¿Por qué mola WPF?</title>
		<link>http://blog.foxandxss.net/index.php/por-que-mola-wpf/</link>
		<comments>http://blog.foxandxss.net/index.php/por-que-mola-wpf/#comments</comments>
		<pubDate>Fri, 05 Jun 2009 16:11:53 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Articulos]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=48</guid>
		<description><![CDATA[Hola!!
Lo prometido es deuda, así que vamos a escribir el por qué mola WPF.

¿Por qué mola WPF?
Microsoft ha estado analizando qué cosas hacia falta mejorar y hacer más cómodas en la programación de escritorio y con esos datos pues creó WPF, una librería que automatiza y nos pone fácil muchas de esas cosas que con [...]]]></description>
			<content:encoded><![CDATA[<p>Hola!!</p>
<p>Lo prometido es deuda, así que vamos a escribir el <b>por qué mola WPF</b>.<br />
<span id="more-48"></span></p>
<h2>¿Por qué mola WPF?</h2>
<p>Microsoft ha estado analizando qué cosas hacia falta mejorar y hacer más cómodas en la programación de escritorio y con esos datos pues creó WPF, una librería que automatiza y nos pone fácil muchas de esas cosas que con otra librería sería difícil de conseguir.</p>
<p>Así que me gustaría hacer un pequeño tour mostrando las features más llamativas de <b>WPF</b> y transmitiros la misma sensación que yo tuve cuando las descubrí.</p>
<h3> XAML </h3>
<p><b>XAML</b>, pronunciado <b>“Zammel”</b> es el nuevo lenguaje creado por Microsoft para la creación de interfaces de usuario en <b>WPF</b> y <b>Silverlight</b>.</p>
<p>XAML es muy parecido al XML de toda la vida y además la creación de interfaces nos recordará mucho a crear una web con XHTML.</p>
<p>Por ejemplo, crear un botón sería tan fácil como esto:</p>
<pre class="brush: xml;">
&lt;Button Content=”OK”  Click=”evento_click” /&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/1.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/1.png" class="alignnone" width="86" height="32" /></a></p>
<p>Como podéis ver, es bastante sencillo de entender, hemos creado un botón y establecido propiedades y eventos. Vamos, sería algo del tipo:</p>
<pre class="brush: xml;">
&lt;Objeto PropiedadX=”...” PropiedadY=”...” EventoZ=”...” /&gt;
</pre>
<p>Podéis asignar cualquier número de propiedades y eventos, o ninguno vaya.</p>
<p>También podéis crear objetos de la siguiente forma:</p>
<pre class="brush: xml;">
&lt;Button Width=”100” Height=”100”&gt;
	….
&lt;/Button&gt;
</pre>
<p>Ésta forma es para tener más control de lo que hace el botón, pero eso ya está fuera del alcance de este tour.</p>
<p>La idea de <b>XAML</b> es buena porque un diseñador no tiene que saber nada de programación.  Simplemente conociendo <b>XAML</b> podrá crear cualquier tipo de interfaz gráfica sin saber nada de <b>C#</b> o <b>VB.NET</b> (o IronPython, etc)</p>
<p>Otra cosa importante de <b>XAML</b>, aunque no es nuevo, viene bien recordarlo, y es que los hijos de los elementos pueden heredar cosas del padre, así que si el padre implementa cualquier cosa, el hijo también lo hará, aunque si al hijo le vuelves a implementar la misma cosa, se aplicará este último (Luego lo veremos con más detalle).</p>
<h2>Layouts y Attached Properties</h2>
<p>Si habéis creado interfaces por ejemplo con Swing alguna vez, ya conoceréis los layouts, o sea, esa manera que tenemos de organizar los controles por la interfaz.</p>
<p><b>WPF</b> tiene menos layouts que Swing por ejemplo, pero si son más potentes gracias a las features que nos da </b>WPF</b>.</p>
<p>Voy a presentar algunos para que los conozcáis:</p>
<p><b>DockPanel</b>: Es probablemente mi layout favorito. Con este layout podremos asignar controles a distintas partes de una ventana, por ejemplo un menú en la parte de arriba, un statusbar en la parte de abajo, una barra a la izquierda&#8230; Con la particularidad, que el último elemento que añadamos podrá usar el espacio restante de la ventana si así lo deseamos.</p>
<p>También podemos añadir varios controles al mismo lado de la ventana.</p>
<p>Veamos un ejemplo:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;WpfApplication1.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Window1&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;
    &lt;DockPanel&gt;
        &lt;Menu DockPanel.Dock=&quot;Top&quot;&gt;
            &lt;MenuItem Header=&quot;Fichero&quot; /&gt;
        &lt;/Menu&gt;
        &lt;StatusBar DockPanel.Dock=&quot;Bottom&quot;&gt;
            &lt;TextBlock Text=&quot;Barra de estado&quot; /&gt;
        &lt;/StatusBar&gt;
        &lt;TextBlock Text=&quot;Hola mundo&quot; /&gt;
    &lt;/DockPanel&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/2.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/2.png" class="alignnone" width="328" height="322" /></a></p>
<p>Aquí como podéis ver, el hijo de la ventana es un <b>DockPanel</b> y dentro hemos creado 3 cosas diferentes:</p>
<ul>
<li>Un Menu</li>
</ul>
<ul>
<li> Un StatusBar</li>
</ul>
<ul>
<li> Un TextBlock</li>
</ul>
<p>El menú lo hemos anclado a la parte superior de la ventana, el statusbar en la parte inferior, y en la parte que sobra, hemos puesto un textblock con un mensajito.</p>
<p>Aquí es donde entran en juego las <b>attached properties</b>, ésto es uno de los nuevos features de <b>WPF</b> y es bastante interesante y da mucho juego.</p>
<p>Las <b>attached properties</b> son una forma de &#8220;propagar&#8221; las propiedades de una clase a otra clase distinta, o sea, es una forma de usar ciertas propiedades en una clase que de otra forma sería imposible.</p>
<p>Por ejemplo, si tenemos una lista y cada elemento de una lista tiene un botón en el cual todos hacen la misma función (borrar el elemento de la lista), podríamos decirle a cada botón que escuche el evento clicked y que todos apunten al mismo controlador del evento. Es una buena solución, pero con las <b>attached properties</b> podemos decirle a la lista en si, que implemente el evento <i>clicked</i> del botón y que borre el elemento seleccionado. Así solo tendríamos un controlador y el evento puesto en un solo lado y no en cada botón que creemos. ¿Cómo hacemos esto? Simplemente &#8220;propagamos&#8221; el evento <i>clicked</i> de la clase <i>Button</i> y ya todos sus hijos pues lo implementarán por lo que dije antes de heredar lo del padre.</p>
<p>Esa lista en concreto se podría haber creado así:</p>
<pre class="brush: xml;">
&lt;ListBox ButtonBase.Click=&quot;...&quot;&gt;
	...
&lt;/ListBox&gt;
</pre>
<p>Como veis, le digo que implemente una <b>attached properties</b>, en concreto el evento <i>clicked</i> de un botón.</p>
<p>Volviendo a nuestro ejemplo del <b>DockPanel</b>, podeis ver que los distintos hijos de éste, usan una <b>attached properties</b> del propio <b>DockPanel</b>, en este caso, dicha <b>attached properties</b> nos sirve para colocar los controles en las distintas partes de la ventana. ¿Mola verdad? Así no hay que ir diciendole al <b>DockPanel</b> que añada tales controles en tales partes, ya son los propios controles los que lo deciden.</p>
<p>Vamos a ver ahora algún <b>layout</b> más, por ejemplo el <b>StackPanel</b>. El <b>StackPanel</b> como su nombre indica, es un tipo de <b>layout</b> donde los elementos que vayamos añadiendo se irán colocando unos debajo de otro. Veamos un ejemplo:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;WpfApplication1.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Window1&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;
    &lt;StackPanel&gt;
        &lt;Button Content=&quot;Boton&quot; /&gt;
        &lt;TextBlock Text=&quot;Texto&quot; /&gt;
        &lt;Rectangle Fill=&quot;Aquamarine&quot; Stroke=&quot;Black&quot;
                   StrokeThickness=&quot;1&quot; Height=&quot;30&quot; /&gt;
    &lt;/StackPanel&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/3.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/3.png" class="alignnone" width="325" height="323" /></a></p>
<p>Nada nuevo por aquí. Creamos el <b>StackPanel</b> y dentro de este vamos colocando controles los cuales se irán colocando uno debajo del otro.</p>
<p>Por último vamos a enseñar el que probablemente es el <b>layout</b> más flexible. El <b>Grid</b>.</p>
<p>Veamos el ejemplo primero:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;WpfApplication1.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Window1&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;
    &lt;Grid&gt;
        &lt;Grid.ColumnDefinitions&gt;
            &lt;ColumnDefinition Width=&quot;auto&quot; /&gt;
            &lt;ColumnDefinition Width=&quot;*&quot; /&gt;
        &lt;/Grid.ColumnDefinitions&gt;
        &lt;Grid.RowDefinitions&gt;
            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
            &lt;RowDefinition Height=&quot;auto&quot; /&gt;
        &lt;/Grid.RowDefinitions&gt;
        &lt;TextBlock Text=&quot;Nombre: &quot; /&gt;
        &lt;TextBox Grid.Column=&quot;1&quot; /&gt;
        &lt;TextBlock Grid.Row=&quot;1&quot; Text=&quot;Email: &quot; /&gt;
        &lt;TextBox Grid.Row=&quot;1&quot; Grid.Column=&quot;1&quot; /&gt;
    &lt;/Grid&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/4.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/4.png" class="alignnone" width="325" height="321" /></a></p>
<p>En el <b>Grid</b>, tenemos que definir el numero de columnas y filas, además de establecer alguna de sus propiedades (opcional).</p>
<p>El <b>Grid</b> es bastante flexible y personalizable. Es este caso he creado una tabla 2&#215;2 como podeis ver. Lo interesante es que podemos definir el tamaño de cada fila/columna de la forma que queramos. En este caso casi todas están en auto, lo que quiere decir es que tendrán el tamaño exacto que ocupe el elemento más grande que contiene, lo cual está bastante bien. Una de las columnas tiene el tamaño puesto en &#8220;*&#8221; eso quiere decir que use el espacio restante, o sea, si la ventana ocupa 300 pixeles de ancho y en la otra columna el elemento más ancho ocupa 50 pixeles, la otra columna ocupará pues 250 pixeles, que es pues el espacio restante.</p>
<p>El resto de código ya no es tan complicado, como podéis ver, hacemos uso de las <b>attached properties</b> para colocar cada control dentro de la zona del <b>Grid</b> que queramos.</p>
<p>Aparte de estos <b>layouts</b> existen otros varios, pero ya se sale del este tour.</p>
<h2>La propiedad Content</h2>
<p>Ésta es probablemente una de mis features favoritas de <b>WPF</b> y sin duda una de las más alabadas.</p>
<p>Muchos de los controles de <b>WPF</b> tienen una propiedad llamada <i>Content</i>. Ésta propiedad es la que usamos para describir lo que hay dentro de los controles.</p>
<p>Por ejemplo, en un botón, la propiedad <i>Content</i> la usaremos para especificar el texto que usará el botón, o sea:</p>
<pre class="brush: xml;">
&lt;Button Content=&quot;OK&quot; /&gt;
</pre>
<p>También podría ser escrito de la siguiente forma:</p>
<pre class="brush: xml;">
&lt;Button&gt;OK&lt;/Button&gt;
</pre>
<p>Este ultimo funciona bien gracias a una feature de <b>WPF</b> llamada <b>Type Converters</b> que convierte esa cadena en un elemento del tipo <i>TextBlock</i>, pero vamos, eso lo explicaré en su dia en otro artículo pues está fuera del alcance de este. Además, lo que pongas entre la etiqueta de abrir y la de cerrar, será el Content del objeto.</p>
<p>Ustedes os preguntaréis, ¿Cual es la parte que mola? Pues esto lo hacen todos los &#8220;rivales&#8221; de <b>WPF</b>.</p>
<p>Faaaaacil, la propiedad <i>Content</i> de los controles, es del tipo <b>Object</b> lo cual nos permitirá poner <b>CUALQUIER COSA</b> como contenido de ese control.</p>
<p>Ya os veo imaginando las posibilidades de esto, no sé, para poner alguna disparatada&#8230; Un navegador dentro de un botón, una lista en la que cada elemento sea como tu quieras, un menú que muestre videos como iconos&#8230;</p>
<p>Y sobretodo, poder poner un panel como la propiedad <i>Content</i> y así tener mucha más flexibilidad.</p>
<p>Imaginad que estais haciendo un reproductor de audio o video (que dicho sea de paso, es algo trivial en WPF) y quereis personalizar un poco los botones, y por ejemplo, un botón que ponga &#8220;Stop&#8221; asi a pelo pues no mola tanto:</p>
<pre class="brush: xml;">
&lt;Button Content=&quot;Stop&quot; /&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/5.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/5.png" class="alignnone" width="93" height="36" /></a></p>
<p>Sin embargo molaría más que además tuviera el icono del stop, así que podríamos hacer:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;WpfApplication1.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Window1&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;
    &lt;Button Height=&quot;23&quot; Name=&quot;button1&quot; Width=&quot;75&quot;&gt;
        &lt;StackPanel Orientation=&quot;Horizontal&quot;&gt;
            &lt;Rectangle Width=&quot;10&quot; Height=&quot;10&quot; Fill=&quot;Black&quot; /&gt;
            &lt;TextBlock Margin=&quot;10, 0, 0, 0&quot; Text=&quot;Stop&quot; /&gt;
        &lt;/StackPanel&gt;
    &lt;/Button&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/6.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/6.png" class="alignnone" width="92" height="37" /></a></p>
<p>¿Mejor verdad? Hemos creado un boton donde su <i>Content</i> sea un <b>StackPanel</b> (orientado horizontalmente) y ahi meter un cuadradito negro y un texto. Podeis cambiar el cuadradito por otra cosa más sotisficada como una imagen o lo que querais.</p>
<p>Ejemplos más completos requieren de features que desconoceis, así que después pondré un ejemplo más chulo sobre este tema.</p>
<h2>Data Binding</h2>
<p>Otra de las features clave de <b>WPF</b>. Los <b>Data Binding</b> no son una cosa nueva de WPF ni mucho menos, pero WPF las lleva a otro nivel y son suuuuuuper sencillas de usar.</p>
<p>Para los nuevos, ¿Qué son los <b>Data Bindings</b>?. Son básicamente una forma de enlazar una propiedad de un objeto con la propiedad de otro objeto. Puede ser entre controles, entre un control y una clase nueva&#8230;</p>
<p>Vaaamos con un ejemplo que será lo mejor:</p>
<pre class="brush: xml;">
&lt;Window x:Class=&quot;PQMW.Window1&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    Title=&quot;Window1&quot; Height=&quot;300&quot; Width=&quot;300&quot;&gt;
    &lt;DockPanel&gt;
        &lt;Slider DockPanel.Dock=&quot;Bottom&quot; x:Name=&quot;alto&quot;
                Minimum=&quot;25&quot; Maximum=&quot;200&quot;/&gt;
        &lt;Slider DockPanel.Dock=&quot;Left&quot; x:Name=&quot;ancho&quot;
                Minimum=&quot;25&quot; Maximum=&quot;200&quot;
                Orientation=&quot;Vertical&quot; /&gt;
        &lt;Ellipse Width=&quot;{Binding Value, ElementName=ancho}&quot;
                 Height=&quot;{Binding Value, ElementName=alto}&quot;
                 Fill=&quot;Blue&quot; Stroke=&quot;Black&quot; StrokeThickness=&quot;1&quot; /&gt;
    &lt;/DockPanel&gt;
&lt;/Window&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/7.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/7.png" class="alignnone" width="352" height="323" /></a><br />
Aqui un siiiiiimple ejemplo, tenemos una ventana con 2 <i>Sliders</i> y un <i>Elipse</i>, el elipse irá creciendo variando en tamaño conforme movamos los sliders (¡Y todo esto sin código!). ¿Cómo? Pues con los <b>Data bindings</b> <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Lo interesante del <b>XAML</b> es el elipse en si:</p>
<pre class="brush: xml;">
&lt;Ellipse Width=&quot;{Binding Value, ElementName=ancho}&quot;
         Height=&quot;{Binding Value, ElementName=alto}&quot;
         Fill=&quot;Blue&quot; Stroke=&quot;Black&quot; StrokeThickness=&quot;1&quot; /&gt;
</pre>
<p>Ahi podéis ver las propiedades <b>Width</b> y <b>Height</b> con una sintaxis más extraña de la que ya conoceis.</p>
<p>Lo que está dentro de las llaves se llama <b>Markup Extensions</b> y que básicamente son una forma de extender la expresividad de <b>XAML</b> hasta limites insospechados. Las cadenas que metemos son evaluadas en tiempo de ejecución (casi todas) lo cual pues está bien. Iremos viendo ejemplos de <b>Markup Extensions</b> más adelante.</p>
<p>En este caso, el Binding es un markup extension y su sintaxis es básica:</p>
<p></i>Propiedad=&#8221;{Binding Propiedad, ElementName=elementoABindear}&#8221;</i></p>
<p>Bueno, realmente no es una sintaxis fija, puedes ignorar el ElementName si el contexto donde esté el control sea el objeto a usar y bla bla, vamos, esto es más bien para presenter el binding en si, hablar de todo su poder lleva unas 30 páginas de un libro o más.</p>
<p>Errr a lo que iba&#8230; En este caso, podeis ver que anclamos el ancho del elipse a la propiedad <i>Value</i> del elemento <i>ancho</i> (el slider de abajo). Lo mismo con la propiedad alto pero con el otro slider.</p>
<p>Entonces, cada vez que deslizo los sliders, las propiedades del elipse van cambiando también.</p>
<h2>Estilos</h2>
<p>¡Las interfaces WPF pueden ser estilizadas como si con CSS se tratase! Pero eso si, esto es más potente que el CSS <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Por ejemplo, basándonos en el ejemplo anterior del elipse con los sliders, vamos al fichero app.xaml del proyecto y lo dejamos así:</p>
<pre class="brush: xml;">
&lt;Application x:Class=&quot;PQMW.App&quot;
    xmlns=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;
    xmlns:x=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;
    StartupUri=&quot;Window1.xaml&quot;&gt;
    &lt;Application.Resources&gt;
        &lt;Style TargetType=&quot;{x:Type Ellipse}&quot;&gt;
            &lt;Setter Property=&quot;Fill&quot;&gt;
                &lt;Setter.Value&gt;
                    &lt;LinearGradientBrush StartPoint=&quot;0,0&quot; EndPoint=&quot;1,1&quot;&gt;
                        &lt;GradientStop Color=&quot;Yellow&quot; Offset=&quot;0.0&quot; /&gt;
                        &lt;GradientStop Color=&quot;Red&quot; Offset=&quot;0.25&quot; /&gt;
                        &lt;GradientStop Color=&quot;Blue&quot; Offset=&quot;0.75&quot; /&gt;
                        &lt;GradientStop Color=&quot;LimeGreen&quot; Offset=&quot;1.0&quot; /&gt;
                    &lt;/LinearGradientBrush&gt;
                &lt;/Setter.Value&gt;
            &lt;/Setter&gt;
            &lt;Setter Property=&quot;Stroke&quot; Value=&quot;Black&quot; /&gt;
            &lt;Setter Property=&quot;StrokeThickness&quot; Value=&quot;2&quot; /&gt;
        &lt;/Style&gt;
    &lt;/Application.Resources&gt;
&lt;/Application&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/8.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/8.png" class="alignnone" width="325" height="324" /></a></p>
<p>Los estilos se crean con la etiqueta <i>Style</i> y en dicha etiqueta definimos el <i>TargetType</i> donde usando un markup extension podemos especificar el control concreto en el que se aplicará el estilo. Con esto, todos los elementos de ese tipo, que estén dentro del &#8220;foco&#8221; de donde hayamos creado el estilo (al crearlo en el app.xaml, el estilo es aplicado en toooooda la aplicación, pero podriamos haberlo creado en una ventana y solo se aplicaría a dicha ventana.)</p>
<p>Además, podriamos crear un estilo que solo se aplicara a los elementos que nosotros quisieramos, simplemente añadiendo la propiedad Key con un nombre y usar dicho nombre para aplicar los estilos manualmente, pero ya sabes, eso está fuera del ambito de este artículo.</p>
<p>Bueno, siguiendo con el estilo. Crear un estilo es fácil. Simplemente es ir colocando <i>Setters</i> para cada propiedad que queramos. Cada <i>setter</i> lleva 2 propiedades, en <i>property</i> especificamos la propiedad a modificar, y en <i>value</i> el valor que queramos darle.</p>
<p>Como podeis ver, el valor no tiene por que ser simple. Puede ser tan complejo como quieras, y ahi en el ejemplo podeis ver como a la propiedad <i>Fill</i> le metemos un degradado ahi majo en vez de un color liso.</p>
<p>Luego, el elipse de la aplicación no deberá hacer nada para aplicar el estilo, así que quedaría así:</p>
<pre class="brush: xml;">
&lt;Ellipse Width=&quot;{Binding Value, ElementName=ancho}&quot;
         Height=&quot;{Binding Value, ElementName=alto}&quot;/&gt;
</pre>
<p>Si ahi colocamos por ejemplo la propiedad <i>Fill</i>, se sobreescribiria la del estilo.</p>
<p>Los estilos son herramientas MUY potentes que nos permiten crear estilos para nuestras aplicaciones de forma fácil como si fuese el CSS de una web. Realmente se puede hacer muchisimo más de lo aqui expuesto, pero eso se deja para otro artículo.</p>
<h3>Triggers</h3>
<p>Los <b>Triggers</b> son una especie de lanzadores que se ejecutan cuando se dan ciertos casos.</p>
<p>Por ejemplo, podría crear uno para que cuando pase el raton por uno de los sliders, aparece un brillo rojo alrededor de el y que cuando saque el ratón de ahi se quite. Se podría crear un evento para el &#8220;mouseenter&#8221; y el &#8220;mouseleft&#8221; para poner o quitar el brillo respectivamente. También se podrían utilizar triggers.</p>
<p>Abre el app.xaml y justo debajo del estilo del elipse, escribe:</p>
<pre class="brush: xml;">
&lt;Style TargetType=&quot;{x:Type Slider}&quot;&gt;
	&lt;Style.Triggers&gt;
		&lt;Trigger Property=&quot;IsMouseOver&quot; Value=&quot;True&quot;&gt;
			&lt;Setter Property=&quot;BitmapEffect&quot;&gt;
				&lt;Setter.Value&gt;
					&lt;OuterGlowBitmapEffect GlowColor=&quot;Red&quot; GlowSize=&quot;4&quot;/&gt;
				&lt;/Setter.Value&gt;
			&lt;/Setter&gt;
		&lt;/Trigger&gt;
	&lt;/Style.Triggers&gt;
&lt;/Style&gt;
</pre>
<p><a href="http://www.foxandxss.net/CosasBlog/porquemolawpf/9.png"><img alt="" src="http://www.foxandxss.net/CosasBlog/porquemolawpf/9.png" class="alignnone" width="327" height="325" /></a></p>
<p>La sintaxis es como la de los estilos, solo que esta vez meteremos el <i>setter</i> dentro de un <b>Trigger</b>.</p>
<p>No me voy a marear demasiado en explicar su sintaxis, puesto que seria mejor hacerlo en otro artículo, pero básicamente comprueba si el ratón está encima del control y si está aplica un brillo de color rojo.</p>
<p>Como verás, con los <b>triggers</b> se pueden hacer muchas cositas como girar un boton cuando lo selecciones, o que de vueltas o no sé, ahi entra tu imaginación.</p>
<h2>Resumen</h2>
<p>Ésta es la punta del iceberg de <b>WPF</b>. Éstas son algunas de las cosas que hace que WPF sea GRANDE.</p>
<p>Hay más cosas que me he dejado en el tintero, ya sean porque todavia no las conozco lo suficiente como para haberlas incluido y otras porque sería complicar mucho el artículo.</p>
<p>Pero aun así, espero que este artículo os haya hecho ver lo que es <b>WPF</b> y lo que puede hacer por vosotros.</p>
<p>Por otro lado, cada aspecto aquí presentado lo está de una forma básica y cada una de esas cosas dan mucho más de si.</p>
<p>Además WPF permite hacer dibujos 2D, 3D, animaciones, transformar elementos para girarlos o doblarlos&#8230;</p>
<p>Pero vamos, la gracia es la que está aqui presentada.</p>
<p>Si habeis llegado hasta aquí, dejad un comentario que no tardareis mucho <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/por-que-mola-wpf/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Reseña: Teach Yourself WPF in 24 Hours</title>
		<link>http://blog.foxandxss.net/index.php/resena-teach-yourself-wpf-in-24-hours/</link>
		<comments>http://blog.foxandxss.net/index.php/resena-teach-yourself-wpf-in-24-hours/#comments</comments>
		<pubDate>Wed, 27 May 2009 19:31:14 +0000</pubDate>
		<dc:creator>Fox</dc:creator>
				<category><![CDATA[Reseñas]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false">http://www.foxandxss.org/blog/?p=34</guid>
		<description><![CDATA[Si quieres iniciarte en el mundo de WPF, tienes una pareja de libros que son idóneos para esta tarea.
Así que vamos a empezar analizando uno de ellos: Teach Yourself WPF in 24 Hours.


No os dejéis llevar por el título del libro, ya que estamos ante una grandiosa obra maestra.
Sé que la serie de libros de [...]]]></description>
			<content:encoded><![CDATA[<p>Si quieres iniciarte en el mundo de WPF, tienes una pareja de libros que son idóneos para esta tarea.</p>
<p>Así que vamos a empezar analizando uno de ellos: Teach Yourself WPF in 24 Hours.</p>
<p><a href="http://www.silverlightbooks.net/images/books/book_l0672329859.jpg"><img class="alignnone" src="http://www.silverlightbooks.net/images/books/book_l0672329859.jpg" alt="" width="192" height="250" /></a><br />
<span id="more-34"></span><br />
No os dejéis llevar por el título del libro, ya que estamos ante una grandiosa obra maestra.</p>
<p>Sé que la serie de libros de Teach Yourself XXX in YY días / horas (e incluso en minutos lo he visto) no tiene buena fama, ya que la gente opina que es imposible aprender a usar lo que el libro explica en el tiempo que el libro dice que tardarás en aprenderlo.</p>
<p>Si bien esto es cierto en algunos casos, en este no lo es, ya que te aseguro que cuando termines de leer todos los capítulos, tendrás la base suficiente como para empezar a hacer tus propias creaciones con WPF.</p>
<p>El libro como habréis podido deducir está dividido en 24 capítulos de 1 hora de duración aproximada. Bueno, la mayoría si lo son, algunos duran algo más y otros algo menos, pero la media está en 24 horas si.</p>
<p>Estos 24 capítulos están a su vez divididos en 4 partes. ¿Por qué pongo tanto énfasis en como está divido el libro? Fácil, este es un libro orientado a proyectos, ¿Qué quiero decir con esto? Pues que en cada parte de libro se desarrollará un programa 100% funcional.</p>
<p>No solo es bueno porque vayamos a practicar con ejemplos reales, sino que además la curva de aprendizaje es digna de elogio y es la curva más asequible que existe actualmente en un libro de WPF.</p>
<p><strong>Parte 1:</strong></p>
<p>El libro empieza con una ligera introducción a XAML (pronunciado &#8216;Zammel&#8217;) que es el lenguaje que se usa para crear las interfaces en WPF, también explica un poco el como organizar los controles por la ventana (layouts) y una pequeña introducción a los “Data Bindings” en WPF.</p>
<p>Iremos aprendiendo estas cosas a la par que construimos un visor de fuentes escrito 100% usando XAML, o sea, nada de código C# (o VB.NET, ironPython&#8230;).</p>
<p>Como primer ejemplo, el visor de fuentes no está mal, muestra todas las fuentes instaladas en el sistema y te deja probarlas con cualquier frase que elijas y te la muestra en distintos tamaños.</p>
<p><strong>Parte 2:</strong></p>
<p>Aquí ya se va introduciendo la colaboración entre XAML y tu lenguaje de programación favorito, además introduce algunos nuevos conceptos como los “Commands”. También te explica como definir los eventos de la interfaz, pero nada nuevo para los que ya han usado Windows Forms u otra librería por el estilo.</p>
<p>Aquí ya se introduce un programa más complejo, un editor de texto clon a WordPad, permitiendo formateado de texto.</p>
<p>Aquí ya empezareis a ver las maravillas de WPF, puesto que con los Commands no tendrás que picar nada de código para implementar cosas tales como el undo, redo, copiar, pegar,guardar, abrir, nuevo&#8230; Vamos, una virguería esto de los Commands, además podremos crear los nuestros propios, algo que sin duda amareis cuando tengáis más practica con WPF.</p>
<p>El editor de texto además nos permitirá imprimir e incluso nos mostrará una vista previa del texto para ver como quedará imprimido.</p>
<p><strong>Parte 3:</strong></p>
<p>Si con la parte 2 os quedasteis sorprendidos, con esta os quedareis sin palabras, os lo prometo.</p>
<p>Se introducen temas como los estilos, algo así como el CSS pero mucho más potente y flexible. También se aprenderá más sobre los Data Bindings y un poco de Data Templates.</p>
<p>Lo realmente BUENO de esta parte es el programa que se crea, que aunque no muy útil, tiene tal cantidad de buen código, que no pararás de aprender cosas con el.</p>
<p>El programa en si es una pequeña agenda de contactos. Lo particularmente bueno con la aplicación es que está construida usando MVP (vamos fue de aquí donde aprendí yo a usarlo) y bueno, es más bonita que las anteriores, ya que se añaden estilos a la ventana y mejora muchísimo visualmente.</p>
<p>También podréis ver las maravillas de usar los Data Bindings; Actualizas el nombre de un contacto en la parte principal de la aplicación y mágicamente se actualiza en la barra superior, en la lateral y en todos lo sitios donde aparezca, y eso con 0 líneas de código.</p>
<p>En resumen, una aplicación bonita visualmente, haciendo un buen uso de lo que ofrece WPF y con una buena estructura de código.</p>
<p><strong>Parte 4:</strong></p>
<p>Y es aquí la ultima parte del libro, con la aplicación más espectacular de todas. También la más larga.</p>
<p>Una pequeñita introducción al 2D creando todo tipo de figuras y líneas. También se profundiza en los temas de estilos, pero esta vez enfocados al tema de transformaciones, efectos, controles personalizados, animaciones, triggers (también para efectos). Vamos, un tema muy muy visual, puesto que estamos ante una aplicación que lo necesita.</p>
<p>Ya tendréis curiosidad de saber que tipo de aplicación se hará aquí. Nada más y nada menos que un programa multimedia donde podemos ver imágenes, vídeos u oír música. Tendrá una interfaz bastante maja y bien cuidada.</p>
<p>Bueno, una vez analizado el libro, vamos a ver los aspectos positivos y negativos:</p>
<p><strong>Positivo:</strong></p>
<ul>
<li>Curva de aprendizaje muy baja</li>
</ul>
<ul>
<li> Orientado a proyectos</li>
</ul>
<ul>
<li> A todo color, tanto código como imágenes.</li>
</ul>
<ul>
<li> Cubre casi todo lo que ofrece WPF</li>
</ul>
<p><strong>Negativo:</strong></p>
<ul>
<li>No se profundiza al 100% en cada aspecto importante de WPF, solo habla de lo que necesita para cada aplicación concreta, aun así, es mucho.</li>
</ul>
<ul>
<li> Alguna errata en el libro, pero nada demasiado grave.</li>
</ul>
<p>Como nota final, debo deciros que el código está en C#.</p>
<p>La nota que le daré a este libro será de 9.5 / 10. Te preguntarás que como es que no le pongo un 10 con lo emocionado que parezco con este libro, y la razón la puse en la primera oración de ésta reseña. Es uno de 2 libros para aprender WPF, ya que hay muchas cosas de WPF que se quedan en el tintero en este libro, cosas que el otro libro si explican, pero es más aburrido que este.</p>
<p>Por si tenéis curiosidad, el otro libro es el de “WPF Unleashed&#8221; de Adam Nathan, considerado el mejor libro de WPF del mercado (aunque yo considero que es necesario ambos libros), del cual hablaré más adelante <img src='http://blog.foxandxss.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Os dejo un enlace:</p>
<p><a href="http://www.informit.com/store/product.aspx?isbn=0672329859">Web oficial</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.foxandxss.net/index.php/resena-teach-yourself-wpf-in-24-hours/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
