<?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/"><channel><title>WPF: Personalizar nuestra aplicación con Styles y Control Templates (I)</title><link>http://geeks.ms/wikis/wpf/wpf-personalizar-nuestra-aplicaci-243-n-con-styles-y-control-templates-i.aspx</link><description>Wiki sobre Windows Presentation Foundation</description><dc:language>en-US</dc:language><generator>CommunityServer 2008.5 SP1 (Build: 31106.3070)</generator><item><title>WPF: Personalizar nuestra aplicación con Styles y Control Templates (I)</title><link>http://geeks.ms/wikis/wpf/wpf-personalizar-nuestra-aplicaci-243-n-con-styles-y-control-templates-i.aspx</link><pubDate>Mon, 26 Jul 2010 04:31:19 GMT</pubDate><guid isPermaLink="false">2a2e7ade-7474-448b-9de5-1515d8bb7d1b:7</guid><dc:creator>Josué Yeray Julián Ferreiro</dc:creator><comments>http://geeks.ms/wikis/wpf/wpf-personalizar-nuestra-aplicaci-243-n-con-styles-y-control-templates-i/comments.aspx</comments><description>Revisión actual enviado a Wiki sobre WPF en Geeks•ms por Josué Yeray Julián Ferreiro a 7/26/2010 6:31:19 AM&lt;br /&gt;
&lt;div align="justify"&gt;Hist&amp;oacute;ricamente, desde los tiempos de Visual Basic a Windows Forms, si dese&amp;aacute;bamos crear una interface personalizada para nuestra aplicaci&amp;oacute;n est&amp;aacute;bamos, limitados a cambiar ciertas propiedades est&amp;aacute;ndar de los controles como el color de fondo, ancho del borde o el tama&amp;ntilde;o de fuente. Si dese&amp;aacute;bamos ir m&amp;aacute;s all&amp;aacute;, nuestra &amp;uacute;nica opci&amp;oacute;n es crear un nuevo control, heredar desde el control existente e invalidar el m&amp;eacute;todo de dibujado para implementar nuestra propia l&amp;oacute;gica de dibujo.&lt;/div&gt;
&lt;div align="justify"&gt;Esto sigue siendo posible en WPF, pero ya no es necesario, pues WPF nos facilita un modelo de extensibilidad basado en Plantillas y Estilos, que nos permite realizar complejas modificaciones y redefiniciones del aspecto visual de un control, sin tener que crear uno nuevo.&lt;/div&gt;
&lt;div align="justify"&gt;&lt;/div&gt;
&lt;!--more--&gt;
&lt;div align="justify"&gt;&lt;/div&gt;
&lt;h3&gt;Nuestro trabajo&lt;/h3&gt;
&lt;div align="justify"&gt;A continuaci&amp;oacute;n puedes ver el origen desde el que vamos a partir:&lt;/div&gt;
&lt;div align="center"&gt;&lt;a href="http://lh4.ggpht.com/_7YCdMP8inuc/TAJ6KSlYyFI/AAAAAAAAADQ/-ct8olcNosA/s1600-h/sin%20estilos%5B4%5D.png"&gt;&lt;img height="450" width="640" src="http://lh3.ggpht.com/_7YCdMP8inuc/TAJ6PSyPPLI/AAAAAAAAADU/cBSUG7BzVhE/sin%20estilos_thumb%5B2%5D.png?imgmax=800" alt="sin estilos" border="0" title="sin estilos" style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;display:inline;" /&gt;&lt;/a&gt; &lt;/div&gt;
&lt;div align="justify"&gt;Y nuestro objetivo es llegar a lo siguiente:&lt;/div&gt;
&lt;div align="center"&gt;&lt;a href="http://lh4.ggpht.com/_7YCdMP8inuc/TAJ6VKWBPPI/AAAAAAAAADY/IWxp5iI-Bs8/s1600-h/Apariencia%5B4%5D.png"&gt;&lt;img height="448" width="640" src="http://lh4.ggpht.com/_7YCdMP8inuc/TAJ6bD5JjlI/AAAAAAAAADc/sF8TolwkG0A/Apariencia_thumb%5B2%5D.png?imgmax=800" alt="Apariencia" border="0" title="Apariencia" style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;display:inline;" /&gt;&lt;/a&gt; &lt;/div&gt;
&lt;div align="justify"&gt;Como puedes ver el cambio es muy grande, es mucho mas atractivo a la vista, con lo que nuestros usuarios se sentir&amp;aacute;n m&amp;aacute;s c&amp;oacute;modos y nuestra aplicaci&amp;oacute;n ganar&amp;aacute; una apariencia exclusiva y &amp;uacute;nica. As&amp;iacute; que, manos a la obra, pero primero, vamos a repasar algunos conceptos b&amp;aacute;sicos de Styles y ControlTemplates en WPF.&lt;/div&gt;
&lt;h3&gt;Un poco de teor&amp;iacute;a&lt;/h3&gt;
&lt;div align="justify"&gt;WPF nos brinda varias formas de personalizar nuestros controles:&amp;nbsp;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Contenido Enriquecido&lt;/li&gt;
&lt;li&gt;Styles&lt;/li&gt;
&lt;li&gt;Data Templates&lt;/li&gt;
&lt;li&gt;Control Templates&lt;/li&gt;
&lt;/ul&gt;
&lt;div align="justify"&gt;En este post me voy a centrar en los Styles y los Control Templates.&lt;/div&gt;
&lt;h5&gt;Styles&lt;/h5&gt;
&lt;div align="justify"&gt;Un objeto Style es una colecci&amp;oacute;n de valores que representan propiedades para el control indicado. Podemos asignarle autom&amp;aacute;ticamente a todos los controles de un mismo tipo, por ejemplo un Button, ciertas propiedades como el color de fondo, tipo de letra, etc&amp;hellip; de esta forma todos nuestros controles de este tipo obtendr&amp;aacute;n estas caracter&amp;iacute;sticas: &lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Style TargetType=&amp;quot;{x:Type Button}&amp;quot;&amp;gt;
&amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;Red&amp;quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;Setter Property=&amp;quot;Foreground&amp;quot; Value=&amp;quot;White&amp;quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;Tambi&amp;eacute;n podemos establecer un nombre al estilo y aplicarlo manualmente a los controles que nos interese usando la propiedad Style de cada uno:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Style x:Key=&amp;quot;EstiloPropio&amp;quot; TargetType=&amp;quot;{x:Type Button}&amp;quot;&amp;gt;
&amp;lt;Setter Property=&amp;quot;Background&amp;quot; Value=&amp;quot;Red&amp;quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;Setter Property=&amp;quot;Foreground&amp;quot; Value=&amp;quot;White&amp;quot;&amp;gt;&amp;lt;/Setter&amp;gt;
&amp;lt;/Style&amp;gt;

&amp;lt;Button Style=&amp;quot;{StaticResource EstiloPropio}&amp;quot;&amp;gt;&amp;lt;/Button&amp;gt;&lt;/pre&gt;
&lt;h5&gt;Control Templates&lt;/h5&gt;
&lt;div align="justify"&gt;Muchos controles en WPF utilizan plantillas para definir su estructura y apariencia. De esta forma su funcionalidad permanece intacta aunque cambiemos su apariencia, y nos da un grado de personalizaci&amp;oacute;n sobre el aspecto del control sin precedentes. Esto nos permite elegir un control por su funcionalidad para llevar a cabo una tarea, sin tener en cuenta que su apariencia no se ajuste a lo que deseamos, pues esta puede ser redefinida totalmente. Este es un ejemplo sencillo de un ControlTemplate para un bot&amp;oacute;n:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ControlTemplate TargetType=&amp;quot;{x:Type Button}&amp;quot;&amp;gt;
&amp;lt;Border Name=&amp;quot;fondoboton&amp;quot; BorderBrush=&amp;quot;red&amp;quot; BorderThickness=&amp;quot;5&amp;quot; 
Background=&amp;quot;Yellow&amp;quot;&amp;gt;
&amp;lt;ContentPresenter Name=&amp;quot;contenido&amp;quot; 
Content=&amp;quot;{Binding Path=Content, 
RelativeSource={RelativeSource TemplatedParent}}&amp;quot;&amp;gt;
&amp;lt;/ContentPresenter&amp;gt;
&amp;lt;/Border&amp;gt;
&amp;lt;/ControlTemplate&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;Y el resultado de esta plantilla si ponemos un bot&amp;oacute;n en nuestro proyecto ser&amp;iacute;a este:&lt;/div&gt;
&lt;div align="center"&gt;&lt;a href="http://lh4.ggpht.com/_7YCdMP8inuc/TAJ6b1MulrI/AAAAAAAAADg/MmfavknlVXY/s1600-h/boton%5B3%5D.png"&gt;&lt;img height="40" width="140" src="http://lh6.ggpht.com/_7YCdMP8inuc/TAJ6cscVlpI/AAAAAAAAADk/0fzF6dV723I/boton_thumb%5B1%5D.png?imgmax=800" alt="boton" border="0" title="boton" style="border-bottom:0px;border-left:0px;border-right:0px;border-top:0px;display:inline;" /&gt;&lt;/a&gt; &lt;/div&gt;
&lt;div align="justify"&gt;Como puedes ver, el control a perdido todo su aspecto, que ha sido reemplazado por el que hemos indicado, pero conservando todo su comportamiento y funcionalidad de bot&amp;oacute;n.&lt;/div&gt;
&lt;h3&gt;Definir el estilo de nuestra aplicaci&amp;oacute;n&lt;/h3&gt;
&lt;div align="justify"&gt;Un paso muy importante a la hora de definir el estilo de nuestra aplicaci&amp;oacute;n es que esta mantenga una coherencia visual a trav&amp;eacute;s de las diferentes pantallas de la misma, para que el usuario tenga una sensaci&amp;oacute;n de familiaridad con nuestra aplicaci&amp;oacute;n aunque se enfrente a pantallas nuevas.&lt;/div&gt;
&lt;div align="justify"&gt;Otro aspecto muy importante es la sencillez de implantaci&amp;oacute;n, en una aplicaci&amp;oacute;n con cientos de controles y decenas de pantallas, no podemos ir control por control y pantalla por pantalla ajustando par&amp;aacute;metros visuales, debe realizarse de forma autom&amp;aacute;tica, para esto WPF nos facilita los ResourceDictionary, archivos Xaml donde podemos incluir todo nuestro c&amp;oacute;digo de estilado e incluirlos de forma global en toda la aplicaci&amp;oacute;n, con lo que, cualquier cambio que hagamos en el estilo o plantilla de un control se aplicar&amp;aacute; autom&amp;aacute;ticamente a todos lo controles de nuestra aplicaci&amp;oacute;n.&lt;/div&gt;
&lt;div align="justify"&gt;Lo primero que debemos realizar es a&amp;ntilde;adir en nuestra aplicaci&amp;oacute;n un nuevo elemento de tipo ResourceDictionary, en mi caso el nombre es BlackCrystal.xaml, este archivo solo tiene vista xaml y al incluirlo deber&amp;iacute;a aparecer algo as&amp;iacute;:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;ResourceDictionary xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;&amp;gt;


&amp;lt;/ResourceDictionary&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;Una vez que tengamos nuestro ResourceDictionary agregado, es momento de indicarle a nuestra aplicaci&amp;oacute;n que haga uso de el, esto lo podemos hacer editando el archivo Application.xaml para decirle la ruta de un nuevo diccionario de recursos que queremos que use, deber&amp;iacute;a quedar as&amp;iacute;:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Application x:Class=&amp;quot;Application&amp;quot;
xmlns=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&amp;quot;
xmlns:x=&amp;quot;http://schemas.microsoft.com/winfx/2006/xaml&amp;quot;
StartupUri=&amp;quot;MainWindow.xaml&amp;quot;&amp;gt;
&amp;lt;Application.Resources&amp;gt;
&amp;lt;ResourceDictionary Source=&amp;quot;BlackCrystal.xaml&amp;quot;&amp;gt;&amp;lt;/ResourceDictionary&amp;gt;
&amp;lt;/Application.Resources&amp;gt;
&amp;lt;/Application&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;Simplemente a&amp;ntilde;adimos un nuevo nodo Application.Resources y dentro del mismo creamos un nuevo objeto ResourceDictionary, indic&amp;aacute;ndole la Ruta (Source) desde la que cargar este diccionario. Con esto, cualquier estilo o plantilla que creemos en nuestro ResourceDictionary estar&amp;aacute; inmediatamente disponible en toda nuestra aplicaci&amp;oacute;n.&lt;/div&gt;
&lt;h3&gt;Elementos Comunes&lt;/h3&gt;
&lt;div align="justify"&gt;Algo importante a la hora de dise&amp;ntilde;ar el look &amp;amp; feel de nuestra aplicaci&amp;oacute;n es dotarla con una apariencia uniforme, mismos colores, mismas geometr&amp;iacute;as y mismas animaciones, si defini&amp;eacute;semos directamente estos par&amp;aacute;metros en cada uno de los estilos y plantillas convertir&amp;iacute;a el mantenimiento de los mismos en un infierno, teniendo que recorrer decenas de sitios para cambiar un solo color. Para solucionar esto el primer trabajo que debemos hacer es definir en nuestro resource dictionary todos los colores y animaciones que queramos usar.El tema de ejemplo que he creado, Black Crystal, usa en total 9 degradados distintos y 2 animaciones que se aplican a todos los controles, estos degradados son de tipo LinearGradient y RadialGradient y las animaciones son DoubleAnimations.&lt;/div&gt;
&lt;div align="justify"&gt;Aqu&amp;iacute; pod&amp;eacute;is ver un ejemplo de Degradado Lineal, este es usado para aplicar al fondo de las ventanas un degradado en tonos de grises:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;LinearGradientBrush x:Key=&amp;quot;DarkBackground&amp;quot; StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#FF333344&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#FF666677&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;El c&amp;oacute;digo xaml es muy sencillo, en la primera l&amp;iacute;nea definimos el tipo de objeto (LinearGradientBrush) le asignamos una Key para poder usar el recurso que estamos creando desde cualquier parte e indicamos el Punto de inicio y de Final, estos puntos se especifican con una pareja de n&amp;uacute;meros que van de 0 a 1, indicando 0,0 la esquina superior izquierda y 1,1 la esquina inferior derecha, el primer numero de cada par indica el punto en el eje X y el segundo n&amp;uacute;mero indica el punto en el eje Y. de esta forma 0,0 a 1,1 indica que nuestro degradado recorrer&amp;aacute; la diagonal desde la esquina superior izquierda a la esquina inferior derecha, un valor de 0,0 a 1,0 indicar&amp;iacute;a que nuestro degradado empezar&amp;iacute;a en la esquina superior izquierda y acabar&amp;iacute;a en la esquina superior derecha, con lo que tendr&amp;iacute;amos un aspecto de degradado de izquierda a derecha horizontal, un valor de 0,0 a 0,1 crear&amp;iacute;a un efecto de degradado vertical.&lt;/div&gt;
&lt;div align="justify"&gt;Los objetos gradientStop indican que color se usara en cada parte del degradado, un degradado puede tener tantos GradientStop como queramos, la propiedad Offset indica la posici&amp;oacute;n del color dentro del degradado, siendo 0 el inicio y 1 el final, podemos usar cualquier valor entre estos n&amp;uacute;meros tal como .2, .35 o .98 y por ultimo Color indica el color a usar en ese punto del degradado, puede ser un color ya establecido por el sistema como White, Purple o Black o una combinaci&amp;oacute;n de colores ARGB (A = Alpha (transparencia), R = Rojo, G = Verde y B = Azul)&lt;/div&gt;
&lt;div align="justify"&gt;El Objeto RadialGradientBrush es muy parecido al LinearGradientBrush y se compone b&amp;aacute;sicamente de los mismos objetos:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;RadialGradientBrush x:Key=&amp;quot;GlowFX&amp;quot; GradientOrigin=&amp;quot;.5,1&amp;quot; Center=&amp;quot;.5,1&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#990000FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;.5&amp;quot; Color=&amp;quot;#660000DD&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#33000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/RadialGradientBrush&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;El mayor cambio aqu&amp;iacute; es que ya no tenemos las propiedades StartPoint y EndPoint, en vez de estas tenemos GradientOrigin y Center. GradientOrigin define el punto desde el que se inicia el degradado, y Center define el punto que ser&amp;aacute; el centro del circulo externo que definir&amp;aacute; el degradado, en este ejemplo tienen valores id&amp;eacute;nticos&amp;nbsp; pero podr&amp;iacute;an ser distintos sin ning&amp;uacute;n problema.&lt;/div&gt;
&lt;div align="justify"&gt;Para aplicar estos recursos a una propiedad de un control basta con enlazar esa propiedad a un recurso est&amp;aacute;tico y especificar el nombre de nuestro degradado, de esta forma:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button Content=&amp;quot;Hola&amp;quot; 
Background=&amp;quot;{StaticResource GlowFX}&amp;quot;&amp;gt;
&amp;lt;/Button&amp;gt;&lt;/pre&gt;
&lt;div align="justify"&gt;Por &amp;uacute;ltimo tenemos las animaciones, en mi caso las he usado para dar un efecto de activaci&amp;oacute;n al pasar el rat&amp;oacute;n sobre los controles o al recibir el foco ciertos controles usando el tabulador:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Storyboard x:Key=&amp;quot;GlowOut&amp;quot;&amp;gt;
&amp;lt;DoubleAnimation x:Name=&amp;quot;AnimGlowOut&amp;quot; BeginTime=&amp;quot;00:00:00&amp;quot; 
Storyboard.TargetName=&amp;quot;GlowRectangle&amp;quot; 
Duration=&amp;quot;00:00:00.250&amp;quot; From=&amp;quot;1&amp;quot; To=&amp;quot;0&amp;quot; 
Storyboard.TargetProperty=&amp;quot;Opacity&amp;quot;&amp;gt;
&amp;lt;/DoubleAnimation&amp;gt;
&amp;lt;/Storyboard&amp;gt;&lt;/pre&gt;
&lt;div style="text-align:justify;"&gt;&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;Como podr&amp;aacute;s ver no es un xaml complicado, en primer Lugar definimos un objeto StoryBoard y le damos un nombre para poder invocarlo desde otros objetos. Este Storyboard contiene nuestra animaci&amp;oacute;n, en WPF existen muchos tipos distintos de animaci&amp;oacute;n, la primera parte del nombre indica el tipo de valor que es capaz de animar, en nuestro caso es un valor de tipo Double, pero podemos encontrar BooleanAnimation, CharAnimation, ColorAnimation y muchos m&amp;aacute;s tipos. Las propiedades que definimos son muy simples, name aplica un nombre a nuestra animaci&amp;oacute;n, BeginTime indica el momento despu&amp;eacute;s de invocar el storyboard en el que esta animaci&amp;oacute;n se iniciar&amp;aacute;, Duration indica el tiempo total que tomara nuestra animaci&amp;oacute;n para ejecutarse, la propiedad atada StoryBoard.TargetName indica el objeto sobre el que se aplicar&amp;aacute; la animaci&amp;oacute;n y StoryBoard.TargetProperty indica la propiedad de este objeto indicado que vamos a animar, por &amp;uacute;ltimo From y To indican el valor inicial y el valor final aplicado a esta animaci&amp;oacute;n. En este caso esta animaci&amp;oacute;n se aplicar&amp;aacute; a un objeto llamado GlowRectangle, y modificar&amp;aacute; gradualmente su propiedad Opacity en el transcurso de 250 milisegundos para llevarla desde 1 (totalmente opaco) a 0 (totalmente transparente).&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;La aplicaci&amp;oacute;n de las animaciones se realiza a trav&amp;eacute;s de los disparadores de eventos (Event Triggers) de un control, en el pr&amp;oacute;ximo articulo lo explicar&amp;eacute; en m&amp;aacute;s detalle pero es algo as&amp;iacute;:&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;Button Name=&amp;quot;GlowRectangle&amp;quot; Content=&amp;quot;Hola&amp;quot;&amp;gt;
&amp;lt;Button.Triggers&amp;gt;
&amp;lt;EventTrigger RoutedEvent=&amp;quot;MouseLeave&amp;quot;&amp;gt;
&amp;lt;EventTrigger.Actions&amp;gt;
&amp;lt;BeginStoryboard Name=&amp;quot;{StaticResource GlowOut}&amp;quot;&amp;gt;
&amp;lt;/BeginStoryboard&amp;gt;
&amp;lt;/EventTrigger.Actions&amp;gt;
&amp;lt;/EventTrigger&amp;gt;
&amp;lt;/Button.Triggers&amp;gt;
&amp;lt;/Button&amp;gt;&lt;/pre&gt;
&lt;div style="text-align:justify;"&gt;A continuaci&amp;oacute;n os dejo un listado de todos los Degradados y animaciones que usaremos en este proyecto, para que pod&amp;aacute;is empezar a jugar con ellas y comprender su uso, en la segunda parte de este art&amp;iacute;culo entraremos directamente a ensuciarnos las manos creando los estilos de los controles.&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;&lt;/div&gt;
&lt;div style="text-align:justify;"&gt;Espero que os sea &amp;uacute;til y os guste! Un gran saludo, nos vemos pronto.&lt;/div&gt;
&lt;pre class="brush: xml;"&gt;&amp;lt;!-- DARK BACKGROUND --&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;DarkBackground&amp;quot; StartPoint=&amp;quot;0,0&amp;quot; EndPoint=&amp;quot;1,1&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#FF333344&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#FF666677&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;

&amp;lt;!-- GLASS EFFECT --&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlassFX&amp;quot; StartPoint=&amp;quot;.5,0&amp;quot; EndPoint=&amp;quot;.5,.5&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#33DDDDDD&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#33000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlassFXDisabled&amp;quot; StartPoint=&amp;quot;.5,0&amp;quot; EndPoint=&amp;quot;.5,.5&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#33BBBBBB&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#11000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;

&amp;lt;!-- GLOW EFFECT --&amp;gt;
&amp;lt;RadialGradientBrush x:Key=&amp;quot;GlowFX&amp;quot; GradientOrigin=&amp;quot;.5,1&amp;quot; Center=&amp;quot;.5,1&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#990000FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;.5&amp;quot; Color=&amp;quot;#660000DD&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#33000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/RadialGradientBrush&amp;gt;
&amp;lt;RadialGradientBrush x:Key=&amp;quot;GlowFXPressed&amp;quot; GradientOrigin=&amp;quot;.5,1&amp;quot; Center=&amp;quot;.5,1&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#660000CC&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1.2&amp;quot; Color=&amp;quot;#33FFFFFF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/RadialGradientBrush&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlowFXRowPressed&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#660000FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;.7&amp;quot; Color=&amp;quot;#660000AA&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#66000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlowFXProgress&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#660099FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;.99&amp;quot; Color=&amp;quot;#660022AA&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#00000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlowFXProgressAnimated&amp;quot; MappingMode=&amp;quot;RelativeToBoundingBox&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#00000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;.50&amp;quot; Color=&amp;quot;#660099FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#00000000&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;
&amp;lt;LinearGradientBrush x:Key=&amp;quot;GlowFXTabSelected&amp;quot; StartPoint=&amp;quot;.5,1&amp;quot; EndPoint=&amp;quot;.5,0&amp;quot;&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;0&amp;quot; Color=&amp;quot;#33DDDDDD&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;GradientStop Offset=&amp;quot;1&amp;quot; Color=&amp;quot;#332222FF&amp;quot;&amp;gt;&amp;lt;/GradientStop&amp;gt;
&amp;lt;/LinearGradientBrush&amp;gt;

&amp;lt;!-- GLOW ANIMATION --&amp;gt;
&amp;lt;Storyboard x:Key=&amp;quot;GlowOut&amp;quot;&amp;gt;
&amp;lt;DoubleAnimation x:Name=&amp;quot;AnimGlowOut&amp;quot; BeginTime=&amp;quot;00:00:00&amp;quot; 
Storyboard.TargetName=&amp;quot;GlowRectangle&amp;quot; 
Duration=&amp;quot;00:00:00.250&amp;quot; From=&amp;quot;1&amp;quot; To=&amp;quot;0&amp;quot; 
Storyboard.TargetProperty=&amp;quot;Opacity&amp;quot;&amp;gt;
&amp;lt;/DoubleAnimation&amp;gt;
&amp;lt;/Storyboard&amp;gt;
&amp;lt;Storyboard x:Key=&amp;quot;GlowIn&amp;quot;&amp;gt;
&amp;lt;DoubleAnimation x:Name=&amp;quot;AnimGlow&amp;quot; BeginTime=&amp;quot;00:00:00&amp;quot; 
Storyboard.TargetName=&amp;quot;GlowRectangle&amp;quot; 
Duration=&amp;quot;00:00:00.250&amp;quot; From=&amp;quot;0&amp;quot; To=&amp;quot;1&amp;quot; 
Storyboard.TargetProperty=&amp;quot;Opacity&amp;quot;&amp;gt;
&amp;lt;/DoubleAnimation&amp;gt;
&amp;lt;/Storyboard&amp;gt;&lt;/pre&gt;</description></item></channel></rss>