Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Silverlight PDF
Silverlight PDF
Pgina 1
INCLUYE
SILVERLIGHT NOVEDADES DE
DESCUBRA UN NUEVO NIVEL EN EL DESARROLLO LA VERSiN 3.0
CONTENIDO DE APLICACIONES PARA INTERNET
1 | INTRODUCCIN A SILVERLIGHT
Experiencia de usuario y portabilidad | Arquitectura de
Silverlight 2 | Microsoft .NET Framework | Interfaz de usuario
y presentacin | El cdigo XAML | Herramientas de desarrollo
4 | XAML AL EXTREMO
El lenguaje XAML | Declaracin de objetos | Controles y
componentes | Grid | GridSplitter | Canvas | StackPanel |
ScrollViewer | Border | Controles de iteracin con el usuario |
Button | CheckBox | RadioButton | HyperlinkButton | Image |
ComboBox | ListBox | TextBlock | TextBox | PasswordBox |
DataGrid | Calendar | DatePicker | ProgressBar | Slider
7 | INTERCONEXIN
Ampliar las funcionalidades | Silverlight desde C# |
DESCUBRA UN NUEVO NIVEL EN EL DESARROLLO
WebClient | Enviar informacin | Capacidad de
almacenamiento | OpenFileDialog | Manejo de hilos |
DE APLICACIONES PARA INTERNET
Temporizador | Hilos y eventos | Consumir servicios desde
Silverlight | Manipular datos | LinQ
SILVERUGHT PARA DISEADORES
8 | EL NAVEGADOR Y SU DOMINIO
Conectar tecnologas | Silverlight 2 y HTML | HtmlDocument
Y DESARROLLADORES
y HtmlElement | HtmlPage | HtmlWindow | Cookies |
Modificar CSS | Silverlight 2 y JavaScript | Llamar funciones MICROSOFT EXPRESSION BLEND 2
| Objetos para JavaScript Y MICROSOFT VISUAL STUDIO 2008
APNDICE A | SILVERLIGHT FUERA DE WINDOWS
SILVERLIGHT UNQ, WCF y SERVICIOS WEB CON C#
APNDICE B | SILVERLIGHT 3, LA NUEVA GENERACIN
Silverlight is the cross-platform, cross-browser plug-in
for rich interactive applications and cutting-edge
CREACiN DE ANIMACIONES Y TCNICAS
NIVEL DE USUARIO media experiences. With advanced tips from our DE ESCRITURA PARA DISPOSITIVOS TCTILES
expert, this book provides practical, grounded advice,
PRINCIPIANTE INTERMEDIO AVANZADO EXPERTO and rich examples, to be ready for todays challenges. INTERACCiN CON JAVASCRIPT, HTML, XML y CSS por MATAS IACONO
1 ,j , "' j I I ' ,1" \ r, ' I II \l '\ j " I I
MANEJE LAS HERRAMIENTAS DE VISTA COMO UN EXPERTO DESARROLLE APLICACIONES PARA WINDOWS Y LA WEB
MANUALES USERS I 352 pginas I ISBN 978-987-663-007-8 MANUALES .CODE I 368 pginas I ISBN 978-987-1347-32-2
00_Silverlight.qxp 9/30/09 1:16 PM Page 1
TTULO: SILVERLIGHT
FORMATO: 17 x 24 cm
PGINAS: 352
Copyright MMIX. Es una publicacin de Gradi S.A. Hecho el depsito que marca la
ley 11723. Todos los derechos reservados. No se permite la reproduccin parcial o to-
tal, el almacenamiento, el alquiler, la transmisin o la transformacin de este libro, en
cualquier forma o por cualquier medio, sea electrnico o mecnico, mediante foto-
copias, digitalizacin u otros mtodos, sin el permiso previo y escrito del editor. Su
infraccin est penada por las leyes 11723 y 25446. La editorial no asume responsa-
bilidad alguna por cualquier consecuencia derivada de la fabricacin, funcionamien-
to y/o utilizacin de los servicios y productos que se describen y/o analizan. Todas las
marcas mencionadas en este libro son propiedad exclusiva de sus respectivos due-
os. Impreso en Argentina. Libro de edicin argentina. Primera impresin realizada
en Sevagraf, Costa Rica 5226, Grand Bourg, Malvinas Argentinas, Pcia. de Buenos
Aires en octubre de MMIX.
ISBN 978-987-663-010-8
Iacono, Matas
Silverlight. - 1a ed. - Banfield - Lomas de Zamora : Gradi, 2009.
352 p. ; 24x17 cm. - (Manual users; 175)
ISBN 978-987-663-010-8
1. Informtica. I. Ttulo
CDD 005.3
00_Silverlight.qxp 9/30/09 1:16 PM Page 3
00_Silverlight.qxp 9/30/09 1:16 PM Page 4
PRELIMINARES
Matas Iacono
Ingeniero de sistemas, Microsoft Most Valuable Professional en
ASP.net, Orador Regional para INETA Latam, Scrum Master cer-
tificado y Microsoft Certified Technology Specialist. Cuenta con
ms de quince aos de experiencia en el desarrollo de software
con distintas tecnologas y metodologas.
Ha dictado cerca de cincuenta conferencias tcnicas en distintos
pases latinoamericanos, as como escrito y publicado artculos en
numerosas publicaciones internacionales.
Ha trabajado para empresas extranjeras de gran envergadura. En
la actualidad, se desempea como ingeniero de software para Mo-
torola Argentina y es profesor en la Universidad Tecnolgica Na-
cional de Crdoba.
Agradecimientos
Agradezco a todos los amigos que me brindaron su apoyo y sus
opiniones sobre lo escrito. A Miguel Saez, de Microsoft, por ha-
berme facilitado material y a Lucas Ontivero, de Motorola Ar-
gentina, por su crtica aguda, que me ayud con el contenido pro-
puesto en el libro.
Dedicatoria
A mi familia, por quedarse a mi lado largos fines de semana mien-
tras conclua este libro.
4
00_Silverlight.qxp 9/30/09 1:16 PM Page 5
Prlogo
PRLOGO
Si hay algo a lo que le debemos la actual difusin de la tecnologa informtica, tan-
to dentro del hogar como de las oficinas, es a la continua evolucin de las interfa-
ces grficas de usuarios (GUI). Gracias a ellas, personas de todas las edades y pro-
fesiones, en todo el mundo, pueden interactuar con equipos de computacin para
fines tan diversos como entretenerse, obtener informacin, realizar clculos y co-
municarse, entre un sinnmero de otras posibilidades.
Es seguro que tanto la constante innovacin en el desarrollo de las interfaces gr-
ficas como la aparicin de Internet han sido los catalizadores para uno de los ms
fabulosos cambios en la manera en que las personas, alrededor del globo, se rela-
cionan mediante el uso de la tecnologa.
Mientras que la Web seguir siendo el mbito de comunicacin del futuro, es de es-
perar que los requerimientos de interactividad entre mquinas y humanos se vuel-
van an ms sofisticados y exigentes. Ante esto, Microsoft desarroll Silverlight, una
nueva apuesta para el desarrollo de elementos de grficos de interaccin con los usua-
rios orientados a la Web.
En este aspecto es, justamente, en el que esta obra hace un gran aporte, al presentar
Silverlight 2.0 de una manera amena, clara y completa. En ella, se abarcan no slo
los pormenores tcnicos de la tecnologa, sino que, adems, el autor se ha esmerado
en brindar al lector un cmulo de conocimientos que slo podra obtenerse mediante
la experiencia, todo esto reflejado en tips, datos tiles, recomendaciones, curiosida-
des, advertencias y todos los consejos que el lector reconocer como invaluables a la
hora de adentrarse en esta apasionante tecnologa.
Por ltimo, quisiera agradecer a Matas Iacono por este maravilloso trabajo que ha
sido una gua segura en el aprendizaje de Silverlight y, con cuya lectura y estudio,
me he sentido guiado y acompaado siempre.
Lucas Ontivero
Ingeniero de software,
Motorola Argentina
5
00_Silverlight.qxp 9/30/09 1:16 PM Page 6
PRELIMINARES
EL LIBRO DE UN VISTAZO
En esta obra se vern los conceptos principales para dominar Silverlight, la tecnologa de
Microsoft orientada al desarrollo de contenido dinmico y animaciones para la Web. El contenido
est dirigido a desarrolladores con conocimiento de Microsoft .Net Framework, C# como lenguaje
principal, y que dominen algunos conceptos de JavaScript y HTML.
6
00_Silverlight.qxp 9/30/09 1:16 PM Page 7
El libro de un vistazo
! INFORMACIN COMPLEMENTARIA
A lo largo de este manual encontrar una serie de recuadros que le brindarn informacin
complementaria: curiosidades, trucos, ideas y consejos sobre los temas tratados.
Cada recuadro est identificado con uno de los siguientes iconos:
_` CURIOSIDADES
E IDEAS , ATENCIN
RRR DATOS TILES
Y NOVEDADES
SITIOS WEB
7
00_Silverlight.qxp 9/30/09 1:16 PM Page 8
00_Silverlight.qxp 9/30/09 1:16 PM Page 9
Contenido
CONTENIDO
9
00_Silverlight.qxp 9/30/09 1:16 PM Page 10
PRELIMINARES
Captulo 6
CERRAR EL CRCULO
MediaElement 188
Ejecutar sonidos 188
Video 194
Elementos con video embebido 195
Marcadores de video 196
Deep Zoom 199
Crear el primer Deep Zoom 200
Incluir Deep Zoom en Silverlight 203
Captulo 5 Dibujar con InkPresenter 208
LUZ, CMARA, ACCIN Dibujar en forma manual 212
Mover objetos 156 Dibujar sobre otros elementos 215
Transformaciones 158 InkPresenter y reas de dibujo 217
Transformacin de traslacin 159 Resumen 219
Transformacin de rotacin 161 Actividades 220
Transformacin escalar 165
Transformacin de distorsin 167 Captulo 7
Aplicar todas las transformaciones 168 INTERCONEXIN
Animaciones 170 Ampliar las funcionalidades 222
DoubleAnimation 171 Silverlight desde C# 222
10
00_Silverlight.qxp 9/30/09 1:16 PM Page 11
Contenido
Captulo 8
EL NAVEGADOR Y SU DOMINIO
Apndice B
SILVERLIGHT 3, LA NUEVA GENERACIN
Silverlight 3 336
Nuevos controles 336
Efectos en tres dimensiones 337
Uso de Pixel Shader 338
Conectar tecnologas 290 Fuera del navegador 339
Silverlight 2 y el HTML 290
HtmlDocument y HtmlElement 292 Servicios al lector
HtmlPage 301 ndice temtico 342
HtmlWindow 307 Sitios web recomendados 345
11
00_Silverlight.qxp 9/30/09 1:16 PM Page 12
PRELIMINARES
INTRODUCCIN
Este libro est orientado a desarrolladores de software, y diseadores visuales y gr-
ficos que deseen expandir su rea de conocimiento de desarrollo hacia el ambiente
web. Un lector con nociones iniciales podr ver, durante los captulos, una evolu-
cin que le dar la oportunidad de aprender sin necesidad de saberes previos sobre
la tecnologa propuesta, Silverlight, mientras que aquel lector con experiencia po-
dr encontrar en estas pginas una gua fundamental para aprender, con agilidad,
conceptos sobre esta tecnologa de Microsoft. Sin embargo, es necesario, para am-
bos lectores, contar con conocimientos medios de desarrollo utilizando Microsoft
C#, as como las tcnica primordiales del funcionamiento y ejecucin de la Web.
Los temas propuestos en el libro fueron seleccionados para cubrir la mayor superfi-
cie de conceptos sobre Silverlight 2, presentados de una manera progresiva de tal
forma que el lector se sienta cmodo con su evolucin y que aprenda a cada paso
que da. Desde la recomendacin y el uso de las herramientas ideales para el desa-
rrollo bajo esta tecnologa, tanto para diseadores como para desarrolladores, gene-
ramos ejemplos prcticos en cada captulo, que abarcan desde HTML hasta C#, as
como la aplicacin de ASP.net y el uso de JavaScript.
Silverlight es un modelo en ebullicin. En el momento de lanzarse la versin 1,
sus caractersticas eran limitadas; pero, al poco tiempo, Microsoft mejor la tec-
nologa y sac a relucir la segunda versin de Silverlight, versin de la que se ocupa
este libro. Pero esta efervescencia, este cambio constante junto a la bsqueda de
un mejor producto y de una tecnologa superior, hicieron que, durante el tiem-
po de escritura de este libro, Microsoft sacara la siguiente versin de Silverlight.
En este momento, ya contamos con la versin 3 de Silverlight como una versin
funcional y finalizada, por lo que incluimos un apartado, al final del libro, para in-
troducir al lector en algunas de las nuevas funcionalidades provistas por Silverlight 3.
De esta forma, con este texto, el lector no slo aprender sobre Silverlight, sino
que tendr un bono extra al final, que le servir de rampa de lanzamiento para
abordar de lleno la nueva versin y permanecer siempre actualizado.
12
01_Silverlight.qxp 9/30/09 1:20 PM Page 13
Silverlight Captulo 1
Introduccin
a Silverlight 2
En este primer captulo veremos
1. INTRODUCCIN A SILVERLIGHT 2
14
01_Silverlight.qxp 9/30/09 1:20 PM Page 15
visible Silverlight. Este software forma parte de dicho crecimiento y sirve como
solucin, ya que plantea una mejor forma de desarrollar contenido dinmico pa-
ra la Web. Esto sucede no slo en lo visual, sino tambin como herramienta de
desarrollo basado en tecnologas comunes ya conocidas.
No debemos equivocarnos al pensar que Silverlight constituye la estrategia de
Microsoft para competir con el ya popular Flash, ex de Macromedia, y ahora de
Adobe. Por el contrario, Silverlight representa una oportunidad de reutilizar el co-
nocimiento ya adquirido sobre cdigo basado en Microsoft.Net Framework, un
modelo que soporta no slo lenguajes desarrollados y mantenidos por esta empresa,
sino que cuenta, por el contrario, con el soporte de compaas creadoras de lengua-
jes tan populares como Borland C# Builder y Delphi, tambin de Borland. De es-
ta forma, Silverlight trae consigo la posibilidad de enriquecer la experiencia visual
en el cliente web, trabajando en cualquiera de los navegadores de Internet ms
conocidos. Puede interactuar y ser modificado por lenguajes como JavaScript, ex-
tendiendo el concepto de HTML dinmico y A.J.A.X. (Asynchronous JavaScript and
XML o, en castellano, JavaScript asncrono y XML). Tambin puede consumir ser-
vicios web o cualquier elemento con la capacidad de retornar XML, al mismo tiempo
que puede ser programado o desarrollado mediante aquel lenguaje que usamos to-
dos los das para nuestros desarrollos, o con el que nos sintamos ms cmodos para
generar las lneas de cdigo que darn vida a nuestra aplicacin.
VB C++ C# J# ...
ASP .NET
Windows
Web Forms Web Services
Visual Studio .NET
Forms
Mobile Internet Toolkit
Sistema Operativo
15
01_Silverlight.qxp 9/30/09 1:20 PM Page 16
1. INTRODUCCIN A SILVERLIGHT 2
, QU ES SILVERLIGHT?
La experiencia demuestra que la primera reaccin por parte de los desarrolladores al ver
Silverlight es asociarlo en forma directa con la competencia de Adobe Flash. Silverlight persigue
objetivos similares, pero se separa de Adobe Flash en ciertos aspectos tcnicos, como lengua-
jes de programacin y arquitectura.
16
01_Silverlight.qxp 9/30/09 1:20 PM Page 17
CardSpace WPF
Microsoft
.NET Framework
Versin 2.0
WF WCF
Silverlight 2 usa, para la representacin visual de sus elementos, XAML. Las mis-
mas etiquetas que, como decamos antes, tambin son soportadas por aplicaciones
de escritorio construidas con WPF. Esto genera una ventaja significativa sobre la
creacin de aplicaciones y la adaptacin del usuario a nuevas tecnologas. Pen-
semos que, al tener un componente comn como XAML para la representacin
visual de elementos de la interfaz grfica, el esfuerzo aplicado para la creacin de
uno de estos componentes puede ser reutilizado y explotado en otros ambientes,
no slo en aquel para el cual Silverlight fue ideado. Pensemos entonces en una
aplicacin de escritorio, con cientos de usuarios que la usan durante meses o aos
y, de un momento a otro, se encuentran usando la misma aplicacin, pero den-
tro de un navegador web, con los mismos botones, el mismo contenido visual e
igual comportamiento. Uno de los lados ms rugosos en la implementacin de un
sistema est atado a la adopcin de ste por parte del usuario, y es en los cambios
de plataformas y ambientes donde se producen las discordias. Aqu es necesario
Microsoft .Net Framework no slo soporta los lenguajes de programacin propuestos por Mi-
crosoft. Tambin podemos encontrar otros como Boo, Icc, Clarion#, Cobol, Corba, Eiffel, Fortran,
Lisp, PHP, Perl y ms. Esto puede resultar en especial interesante, ya que no necesitamos apren-
der un nuevo lenguaje para desarrollar en Microsoft .Net Framework.
17
01_Silverlight.qxp 9/30/09 1:20 PM Page 18
1. INTRODUCCIN A SILVERLIGHT 2
invertir mayor esfuerzo para que esta nueva idea sea aceptada. Por tal motivo, nos
har falta toda la ayuda posible al momento de hacer este cambio.
En la Web, las aplicaciones tienen ms representatividad y, por ende, su atractivo
y su facilidad de uso necesitan potenciarse. Esta mejora es llevada a cabo por la
implementacin de soluciones que conjugan JavaScript y XML, dando como pro-
ducto la pieza conocida como A.J.A.X., donde bien podemos encontrar cientos de
modelos listos para ser implementados. Pero el desarrollo sigue enfocndose en la
manipulacin del HTML que, sin desmerecer sus posibilidades, siempre llegar a
un techo mximo, relacionado con las capacidades del mismo modelo HTML. En
comparacin con el modelo de aplicaciones de escritorio, la interactividad ofrecida
por este ltimo es muy superior a la que presenta HTML, y es aqu donde Silverlight,
una vez ms, explota lo mejor de estos dos mundos y lo lleva en forma directa al
mbito de aquel que pierde en comparacin: el del HTML.
Aplicaciones
Navegadores web de escritorio
CSS/HTML XAML
JavaScript/AJAX
Framework .Net
ASP.net
Es importante entender las diferencias entre las versiones de Microsoft .Net Framework. Slo a
partir de la versin 3, se incorpora el uso de XAML, as como WPF, pero el ncleo de este Fra-
mework se mantiene idntico al de la versin 2. Al desarrollar para cualquiera de estas nuevas
plataformas, deberemos elegir una versin de Framework 3 o superior.
18
01_Silverlight.qxp 9/30/09 1:20 PM Page 19
Como observamos en la Figura 3, Silverlight toma lo mejor de los dos mundos. Por
un lado, los controles y componentes verstiles propuestos por el desarrollo de es-
critorio y, por el otro, la portabilidad entre plataformas y la rapidez de la actuali-
zacin de aplicaciones a miles de usuarios al mismo tiempo que otorga Internet.
Esta versatilidad y portabilidad entre plataformas, tanto de escritorio como web,
no sera posible sin un lenguaje comn de representacin de controles.
XAML es el lenguaje que nos dar esta posibilidad no slo para el desarrollo, sino
que tambin brinda la oportunidad de aumentar la versatilidad de las interfaces,
poder llevar el comportamiento de las aplicaciones de escritorio a la Web, posibi-
litar la adopcin por parte del usuario final de manera independiente del sistema,
mediante el aumento de la calidad y de la velocidad en el desarrollo, y otros pun-
tos ganados con la utilizacin de XAML y Silverlight.
Arquitectura de Silverlight 2
Al comienzo de nuestro recorrido, nombramos algunas de las caractersticas de Sil-
verlight que, al mismo tiempo, definen su planteo arquitectnico. Dijimos que
Silverlight est enfocado a la Web y que es ejecutado por el navegador web. Es-
to se consigue gracias a un plugin o aditivo que har las veces de gestor o in-
trprete. Este componente ronda los 5 megabytes, lo que constituye una suma
muy pequea en relacin con su potencia. En la actualidad, es soportado por los
principales navegadores de Internet como Internet Explorer, FireFox y Safari,
as como los sistemas operativos Windows (con base en Windows XP con Service
Pack 2 y hasta Windows 7), Mac OS X 10+ y Linux.
Pero Silverlight, aunque hemos hecho hincapi en la gestin de interfaces de usuario,
no slo es un lienzo donde podemos crear animaciones vectoriales, sino, muy por el
contrario, consiste en una plataforma liviana de desarrollo con soporte para SOA
(Service Oriented Architecture o, en castellano, Arquitectura Orientada a Servicios), re-
des, manejo de datos, y ms. Como observamos en la Figura 4, Silverlight va mucho
ms all y nos entrega, por sobre todas las cosas, acceso a las ltimas tecnologas y
patrones de desarrollo de software. Podemos separar y enumerar las diferentes carac-
tersticas sobre la base de su rea de trabajo, como veremos a continuacin.
Por lo general, es difcil lograr que un usuario adopte una nueva aplicacin cuando est acos-
tumbrado a la que usa desde hace aos. Este problema de adopcin se ve potenciado en quienes
nunca usaron una computadora. Pero, si podemos reproducir en el ordenador lo que el usuario
est acostumbrado a utilizar en la vida real, la adopcin ser casi transparente.
19
01_Silverlight.qxp 9/30/09 1:20 PM Page 20
1. INTRODUCCIN A SILVERLIGHT 2
DLR BCC
XAML
Multimedia
VC1
WMA
MP3
Centro de presentacin
Manejo de navegador
Integrado Integrado Servicio Instalador
con la red con DOM de aplicaciones
20
01_Silverlight.qxp 9/30/09 1:20 PM Page 21
21
01_Silverlight.qxp 9/30/09 1:20 PM Page 22
1. INTRODUCCIN A SILVERLIGHT 2
El cdigo XAML
Ya hemos nombrado a XAML como uno de los componentes fundamentales de
Silverlight, pero veamos un poco ms en profundidad de qu se trata exactamen-
te. XAML es un lenguaje declarativo, formado por etiquetas descriptivas para
cada uno de los componentes que Silverlight pueda representar. XAML basa el
concepto descriptivo en el conocido modelo de XML. Gracias a esta cualidad (ba-
se de XML), entender la estructura de XAML resulta simple e intuitivo. Veamos
a continuacin un ejemplo de elementos XML simples:
Debido a que Silverlight puede ser desarrollado con los principales lenguajes de programacin
soportados por Microsoft .Net Framework, ste brinda pleno soporte para la programacin orien-
tada a objetos y puede absorber todos los beneficios inherentes a este modelo de programacin.
22
01_Silverlight.qxp 9/30/09 1:20 PM Page 23
<Contenedor>
<Elemento Atributo=Valor>
Contenido del Elemento
</Elemento>
</Contenedor>
Etiquetas o tags descriptivas dentro de caracteres < y >. Cada elemento es iniciado con
un nombre especfico y siempre deberemos sealar su cierre utilizando el mismo nom-
bre ms los caracteres </, lo que especificar la finalizacin del tag. En el ejemplo, tam-
bin podemos notar cmo un elemento puede contener otros elementos, as como atri-
butos descriptivos y valores dentro del mismo nodo. XAML sigue este mismo patrn:
El ejemplo en XAML nos demuestra que la estructura es similar al del que hemos
usado para XML, con la salvedad de que las etiquetas o tags ya se encuentran defi-
nidas y asociadas a los elementos visuales que representan. En el ejemplo, colocamos
un contenedor que tendr un tamao en ancho y en alto de 300 pixeles, y color de
fondo azul. Dentro de este contenedor, encontramos otro control utilizado para la
visualizacin de textos, que mostrar la frase Hola Mundo! en pantalla.
23
01_Silverlight.qxp 9/30/09 1:20 PM Page 24
1. INTRODUCCIN A SILVERLIGHT 2
El ejemplo nos sirve, al mismo tiempo, para mostrar otros atributos importantes den-
tro del mundo de XAML y de Silverlight. Tanto el elemento Canvas como TextBlock
son controles preestablecidos por el entorno de Silverlight. Canvas es utilizado
para definir un elemento contenedor de otros componentes, y TextBlock nos da la
posibilidad de mostrar texto en pantalla en forma de bloques. La combinacin de
estos elementos produce lo que aparece en la Figura 6, pero el concepto va ms all
porque muestra cmo, anidando elementos, podemos conseguir diferentes efectos
visuales. As, es posible mezclar un control del tipo botn con un control utilizado
para mostrar imgenes o videos y obtener como resultado un botn en cuyo fondo
se reproduce un video. Por ltimo, el atributo x:Name es el que le otorga, al con-
trol, la capacidad de tener un nombre nico, descriptivo, que podr ser usado por
el lenguaje de programacin que elijamos para darle funcionalidad a la interfaz vi-
sual. Con este atributo, podremos cambiar el texto representado al principio en tiem-
po de ejecucin, sobre la base de la reaccin de un evento por parte del usuario o
por parte del flujo de nuestra aplicacin. A medida que avancemos en el libro, nos
introduciremos dentro de XAML; tambin en los diferentes componentes y con-
troles disponibles por parte del entorno de desarrollo y libreras de objetos.
Gracias a la extensibilidad de XML como lenguaje de etiquetas es que XAML genera un nuevo sub-
conjunto de estas etiquetas para la representacin de controles en el entorno de Silverlight. As
lo hace flexible en la creacin de los elementos, fcil de entender y portable entre ambientes.
24
01_Silverlight.qxp 9/30/09 1:20 PM Page 25
Adems del Service Pack 1 para Visual Studio 2008, tambin deberamos contar con el con-
junto de herramientas de Silverlight. stas pueden ser descargadas desde la direccin
www.microsoft.com/downloads, ingresando Silverlight 2 tools for Visual Studio 2008 como
criterio de bsqueda.
25
01_Silverlight.qxp 9/30/09 1:20 PM Page 26
1. INTRODUCCIN A SILVERLIGHT 2
Por otro lado, tambin existe una herramienta para diseadores grficos que no
cuenten con experiencia en el desarrollo de software. Con una interfaz similar a
la de herramientas para manejo fotogrfico, Microsoft Expression Blend 2 le
permite al diseador grfico, y por qu no al desarrollador, construir XAML de
manera rpida y amigable, como toda herramienta WYSIWYG (What you see is
what you get o en castellano Lo que ves es lo que obtienes) por sus siglas en in-
gls. Esto quiere decir que, al trabajar con Microsoft Expression Blend 2, el
diseo que planteemos ser igual al resultado final en el momento de ejecucin
de la aplicacin de Silverlight. Deberemos usar Microsoft Expression Blend 2 si
estamos habituados a la creacin de imgenes vectoriales o si slo buscamos ace-
lerar el desarrollo de componentes Silverlight. Veremos ms a fondo las cualida-
des de Microsoft Expression Blend 2 a lo largo de los captulos, con suficiente
detalle como para poder utilizarlo con cierta seguridad.
Por ltimo, cabe mencionar que Microsoft Visual Studio 2008 y Microsoft Ex-
pression Blend 2 se compenetran de tal forma que, por lo comn, nos veremos
creando cdigo en la primera herramienta, abriendo y editando el mismo pro-
yecto en la segunda, para terminar con algunos retoques artsticos o acelerar el
enlazado de datos en nuestro trabajo. En la Figura 9, podemos observar cmo un
proyecto creado en Visual Studio 2008 puede ser abierto y manipulado en for-
ma directa con Microsoft Expression Blend 2.
Debido al mismo motivo citado en el caso de Visual Studio 2008, es necesario
instalar un conjunto de herramientas en Microsoft Expression Blend 2 para con-
tar con plantillas que den soporte a Silverlight 2. En este caso, el Service Pack 1
para Microsoft Expression Blend 2 nos otorgar la prestacin.
26
01_Silverlight.qxp 9/30/09 1:20 PM Page 27
A lo largo del libro haremos referencia a estas dos herramientas, que sern usadas
para los distintos ejemplos que plantearemos. Por tal motivo, es recomendable con-
tar con las herramientas instaladas en nuestro equipo antes de continuar con los
siguientes captulos. Es posible tambin realizar los ejemplos con las versiones gra-
tuitas de Visual Studio 2008 (Visual Studio 2008 Express), aunque no podemos
garantizar que los ejemplos de interfaz y otros aspectos concuerden con lo que los
usuarios de estas versiones vern en sus equipos.
RESUMEN
Silverlight puede ser una herramienta extremadamente potente con soporte basado en
Microsoft .Net Framework, que nos otorga la posibilidad de desarrollar en el lenguaje y la forma
que mejor nos convenga. Desde la versin 1 de Silverlight hasta la actual, ha habido mejoras
notables, con mayor funcionalidad y prestaciones tanto para el desarrollador como para el
diseador visual. El usuario final se ve beneficiado al tener que descargar un plugin de tamao
pequeo y que trabaja en casi todos los navegadores y sistemas operativos de la actualidad.
27
01_Silverlight.qxp 9/30/09 1:20 PM Page 28
ACTIVIDADES
1 En qu modelo se basa el cdigo XAML pa- 1 Dirjase al sitio web de la W3C (www.
ra representar los elementos de la interfaz? w3.org/XML) para aprender ms sobre
XML.
2 Subconjunto de qu otro modelo de desa-
rrollo visual para Windows podramos con- 2 Para introducirse mejor en el mundo de
siderar a Silverlight? Silverlight, intente ampliar el ejemplo pro-
puesto en este captulo, modificando el
3 Qu versin de Microsoft .Net Framework tipo de fuente y el color de fondo de la apli-
necesitamos, como mnimo, para trabajar cacin creada.
con Silverlight 2.0?
3 Para conocer ms sobre desarrollo con
4 Qu sistemas operativos y navegadores Microsoft .Net, tome el curso gratuito del
web soportan la ejecucin de Silverlight 2.0? Desarrollador 5 Estrellas desde el sitio
web de Microsoft. Este curso ayuda a en-
5 Qu herramienta resulta ideal para desa- tender trminos utilizados en este libro. La
rrolladores, que les permita potenciar el URL es www.mslatam.com/latam/msdn/
desarrollo de aplicaciones Silverlight 2.0? comunidad/dce2005.
6 Los diseadores visuales cuentan con al- 4 Instale Microsoft Expression Blend 2 y
guna herramienta de software que los ayu- djelo listo para trabajar en el siguiente
de a crear contenido para Silverlight 2.0? captulo.
7 Es necesario instalar algn aditamento en 5 Una vez instalados Visual Studio 2008 y
la herramienta de desarrollo? Microsoft Expression Blend 2, ingrese en
www.silverlight.net, el sitio oficial de
8 Silverlight 2.0 provee algn conjunto de Silverlight, descargue los ejemplos y
componentes listos para usar? analcelos. Esto ayuda a entender con
mayor facilidad esta tecnologa.
9 Por qu es importante crear interfaces
atractivas e intuitivas en las aplicaciones?
28
02_Silverlight.qxp 9/30/09 1:23 PM Page 29
Silverlight Captulo 2
Microsoft
Expression
Blend 2
Cules son las herramientas disponibles
30
02_Silverlight.qxp 9/30/09 1:23 PM Page 31
embargo, ste seguira encontrndose una y otra vez ante una herramienta que,
aunque en esencia cubriera sus necesidades funcionales y resolviera el dominio del
problema planteado, no abarcara los conceptos de usabilidad, ergonoma visual
o interactividad entre el hombre y la mquina.
, CONSULTEMOS A UN DISEADOR
31
02_Silverlight.qxp 9/30/09 1:23 PM Page 32
<tr>
<td><img src=images/spacer.gif width=103 height=1 border=0alt=
/></td>
32
02_Silverlight.qxp 9/30/09 1:23 PM Page 33
<td>
[...41 lneas eliminadas ...]
<td colspan=2><img name=Untitled1_r4_c1 src=images/Untitled-
1_r4_c1.gif
width=112 height=60 border=0 id=Untitled1_r4_c1 alt= /></td>
<td><img src=images/spacer.gif width=1 height=60 border=0 alt=
/></td>
</tr>
Y, si bien este cdigo puede ayudar, resulta imposible de usar para el desarrollador,
por lo que ste se ver forzado a reescribir partes o su totalidad para poder obtener
cdigo que le sea til. Para esto utilizar slo cdigo HTML, debido a que a ste se
le pueden agregar cuestiones programticas a diferencia del anterior.
<span>Filtro de bsqueda</span>
<br>
<select>
<option></option>
<option></option>
<option></option>
</select>
33
02_Silverlight.qxp 9/30/09 1:23 PM Page 34
El problema es claro: estas herramientas hacen las veces de traductores, pero no de ge-
neradores. Traducen lo que el diseador quiso decir a algo que el desarrollador pueda
entender, pero, en este proceso de traduccin, las herramientas no traducen funciona-
lidad, por lo que el desarrollador no la obtendr y deber retraducirla por su cuenta.
La diferencia sustancial sobre este concepto por parte de Expression Blend 2 reside en
que no es un traductor, sino un generador de funcionalidad, con la caracterstica
de que para el diseador la herramienta se comportar como cualquier otra herra-
mienta de las que est acostumbrado a usar. Sin embargo, a medida que diagrama y
disea los contenidos visuales, sta generar funcionalidad lista para ser implementa-
da por el desarrollador de software, como podemos observar en el siguiente cdigo:
_` OPTIMIZACIN DE LA INTERFAZ
34
02_Silverlight.qxp 9/30/09 1:23 PM Page 35
</ComboBox.Background>
</ComboBox>
</Grid>
El diseador ver, en lugar del cdigo anterior, un modelo como el que se mues-
tra en la figura que aparece a continuacin:
Como el desarrollador obtiene cdigo que se adapta a sus necesidades, puede en-
focarse directamente en la solucin del problema. A modo de ejemplo, en las si-
guientes lneas de cdigo vemos cmo el desarrollador agrega algunas lneas de
cdigo C# en la clase asociada al cdigo XAML para generar funcionalidad so-
bre el producto del diseador:
this.ComboBox.Items.Add(Item 1);
this.ComboBox.Items.Add(Item 2);
35
02_Silverlight.qxp 9/30/09 1:23 PM Page 36
this.ComboBox.Items.Add(Item 3);
}
}
Microsoft Expression Blend 2, entonces, sirve de nexo entre los dos elementos
involucrados en el desarrollo, tanto para diseadores como para desarrolladores.
De esta manera se logra que los productos resultantes en ambos casos sean com-
patibles entre s, para que ninguno de los profesionales involucrados tenga la ne-
cesidad de salir de su mbito natural de trabajo. El resultado final ser, entonces,
que el diseador obtendr en la pieza de software el comportamiento y la apariencia
visual, tal como los haba ideado, mientras que el desarrollador no se ver forzado
a intentar traducir estas ideas a elementos programticos y se dedicar exclusiva-
mente a la funcionalidad y a la resolucin del problema.
Contar con un diseo visual de la aplicacin de manera temprana no slo sincronizar a los
miembros del equipo de desarrollo, ya que todos tendrn una idea general del producto final, sino
que puede servir de disparador de retroalimentacin por parte del cliente al ver con antelacin
la idea del producto terminado.
36
02_Silverlight.qxp 9/30/09 1:23 PM Page 37
Aplicacin WPF: este tipo de proyecto representa una aplicacin de escritorio con
soporte para WPF. Si tenemos en cuenta que WPF tambin se compone de cdigo
XAML, es posible crear un entorno visual directamente desde Expression Blend 2.
Librera de controles WPF: esta librera de controles est especializada en el en-
capsulamiento de elementos XAML y cdigo de programacin para su posterior
reutilizacin en aplicaciones WPF. Debemos optar por esta opcin cuando quere-
mos crear elementos reutilizables para ser incorporados en distintas aplicaciones.
Sitio de Silverlight 1: este tipo de proyectos est orientado a crear sitios web con
soporte para la versin 1 de Silverlight. Debemos tener en cuenta que este modelo
no es tratado en este libro y adems representa una versin antigua del software.
Aplicacin de Silverlight 2: una vez instalado el Service Pack 1 para Expression
Blend 2, podremos ver esta clase de trabajos. ste es el tipo de proyectos sobre los
cuales nos moveremos, tanto de manera visual como programtica.
, CONTROLES EN SILVERLIGHT
37
02_Silverlight.qxp 9/30/09 1:23 PM Page 38
Adems de poder indicar el nombre del proyecto que vamos a crear y la ubica-
cin fsica que tendr, es posible seleccionar el lenguaje de programacin con el
cual preferimos trabajar. Vale aclarar que, para poder conseguir esta lista, es ne-
cesario haber instalado esos lenguajes en nuestra estacin de trabajo. El hecho de
poder seleccionar un lenguaje de programacin se refiere a que cualquier cdigo
que se realice desde Expression Blend 2 se har en ese lenguaje, por lo que es im-
portante elegir aquel con el que estemos ms familiarizados.
Explorador de soluciones
Una vez que hemos creado el proyecto Silverlight 2, podremos navegar entre sus
archivos desde el explorador de la solucin, que tpicamente puede ser encontrado
a la derecha de la aplicacin, como podemos observar en la Figura 6. Este explorador
nos mostrar, como elementos iniciales, una pgina del tipo XAML ms una clase
creada en el lenguaje seleccionado, en este caso C#. Esta clase de C# es la que ser
usada para generar el cdigo que maneje los elementos creados en la pgina XAML.
RRR INTEROPERABILIDAD
Para mejorar nuestro desarrollo en Expression Blend 2, es recomendable tener instalado, ade-
ms, alguna de las herramientas de desarrollo de software de Microsoft, como por ejemplo
Visual Studio 2008. Esto har que, de tener que agregar cdigo de programacin a nuestro pro-
yecto Silverlight, lo podamos hacer con mayor facilidad desde estas herramientas.
38
02_Silverlight.qxp 9/30/09 1:23 PM Page 39
<UserControl
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
x:Class=SilverlightApplication2.Page
Width=640 Height=480>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
Es posible hacer que nuestro control Silverlight se adapte a la superficie que lo contiene. Si co-
locamos el elemento Silverlight dentro de una tabla HTML y configuramos las propiedades del
elemento para que sus atributos Width y Height sean igual a Auto, ste se adaptar de manera
automtica a las dimensiones de su contenedor.
39
02_Silverlight.qxp 9/30/09 1:23 PM Page 40
using System.Windows.Shapes;
namespace SilverlightApplication2
{
La pgina App.xaml
La pgina App.xaml, junto con la clase de cdigo que la representa, es otro de los
archivos creados inicialmente. Esta clase es usada en especial para almacenar c-
digo XAML, que en el caso de App.xaml puede ser reusado dentro de todas las
dems pginas de tipo XAML. Como podemos ver en el siguiente cdigo:
Como una buena prctica en el desarrollo de software, encontramos los patrones de diseo de
software. stos representan formas de crear cdigo para solucionar problemas especficos. Es
importante tener presente estos patrones para mejorar la calidad del cdigo creado en Silverlight.
Como resultado, obtendremos cdigo ms prolijo y ms fcil de modificar.
40
02_Silverlight.qxp 9/30/09 1:23 PM Page 41
<Application.Resources>
<! Resources scoped at the Application level should be defined here.
>
<Style x:Key=TextBoxStyle1 TargetType=TextBox>
<Setter Property=BorderThickness Value=1/>
<Setter Property=Background>
<Setter.Value>
<LinearGradientBrush EndPoint=0.5,1
StartPoint=0.5,0>
<GradientStop Color=#FFE8EFF1/>
<GradientStop Color=#FF87DFF4 Offset=1/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property=Foreground Value=#FFFF0000/>
<Setter Property=Padding Value=2/>
<Setter Property=BorderBrush>
...
...
Debemos tener cuidado en la cantidad de informacin que agregamos a nuestros archivos XAML,
ya que stos deben ser descargados por el usuario. Un archivo de gran tamao tomar ms
tiempo en ser descargado, en detrimento de la experiencia del usuario. Podemos usar carga por
demanda para mejorar esta experiencia.
41
02_Silverlight.qxp 9/30/09 1:23 PM Page 42
public App()
{
this.Startup += this.OnStartup;
this.Exit += this.OnExit;
this.UnhandledException += this.Application_UnhandledException;
InitializeComponent();
}
42
02_Silverlight.qxp 9/30/09 1:23 PM Page 43
Desde esta rea central, tambin es posible interactuar en forma directa con el
cdigo XAML. En nuestra interfaz podemos ver, en la parte superior derecha, las
opciones para intercambiar entre los diferentes modos de visualizacin: Diseo,
XAML o Dividir (mixto), y tenemos la posibilidad de modificar los componentes
desde cualquiera de estas vistas. Si contamos con cierta experiencia en edicin de
43
02_Silverlight.qxp 9/30/09 1:23 PM Page 44
En esta rea tambin podemos encontrar, en la parte superior, opciones que tengan
que ver con el proyecto. En especial, la pestaa relacionada con los recursos de
la aplicacin, donde se listarn todos los atributos previamente configurados,
como los alojados en el archivo App.xaml, que ya hemos tratado. La gran venta-
ja de esta lista de recursos radica en que podemos arrastrar cualquiera de estos
En Silverlight, no slo es posible modificar la apariencia visual de los controles nativos mediante
la generacin de esquemas. Tambin podremos crear nuestros propios componentes y controles
heredndolos en nuestro propio cdigo y creando nueva lgica funcional.
44
02_Silverlight.qxp 9/30/09 1:23 PM Page 45
elementos sobre alguno de los controles existentes para aplicar las configuracio-
nes a ese control. El resultado de arrastrar el estilo configurado al inicio permite
obtener lo que podemos ver en la siguiente figura.
Figura 10. El control de caja de texto posee, una vez aplicado, el estilo
definido en el elemento TextBoxStyle1, que aparece debajo de la pestaa de recursos.
El ltimo panel que agrupa informacin sobre nuestra aplicacin Silverlight se en-
cuentra a la izquierda del lienzo de dibujo. Sobre estos grupos, en la parte superior, se
ubican las transformaciones y animaciones de los componentes de nuestra aplica-
cin. Aunque hablaremos de estas propiedades con mayor detalle en el captulo 5, vale
recalcar que se pueden generar diferentes efectos de movimiento y transformaciones
desde esta seccin. Debajo de este panel, se encuentra el rbol de controles de la p-
gina que estamos visualizando. Los controles se agruparn de manera jerrquica sobre
la base del contenedor inmediato superior. Si tenemos en cuenta que los controles
XAML pueden ser contenedores de otros controles XAML, esta estructura nos dar
rpido acceso a cada uno de los elementos que componen un control de manera rpi-
da. En la Figura 11, podemos ver un ejemplo de este rbol y del panel de animaciones.
_` COMPRESIN DE ARCHIVOS
Todas las imgenes, videos y sonidos que agreguemos a nuestro proyecto, as como cualquier
archivo externo, sern comprimidos en un nico archivo final con extensin XAP. Este archivo
es, en realidad, un archivo zip que contiene todos los elementos creados por el proyecto Silverlight.
45
02_Silverlight.qxp 9/30/09 1:23 PM Page 46
La barra de herramientas
Desde la barra de herramientas de Expression Blend 2, tendremos acceso a todos
los controles y componentes preestablecidos de Silverlight y de Microsoft .Net
Framework. Podemos separar la lista de controles en los siguientes grupos:
Elementos de dibujo: son aquellos que nos dan acceso a herramientas de dibujo
vectoriales. Con stos, podremos dibujar lneas, curvas, crculos y rectngulos.
46
02_Silverlight.qxp 9/30/09 1:23 PM Page 47
Figura 14. Controles ms comunes para capturar informacin por parte del usuario.
Los controles antes nombrados suelen ser los que se usan con mayor frecuencia para el
desarrollo de aplicaciones con Silverlight, pero existen otros que no se ven de forma di-
recta. Para poder acceder a ellos, es necesario seleccionar el ltimo elemento de la lista
en la barra de herramientas. Al hacerlo, podremos ver la lista completa de controles dis-
ponibles y agregarlos a nuestra coleccin de controles, como se muestra a continuacin.
47
02_Silverlight.qxp 9/30/09 1:23 PM Page 48
48
02_Silverlight.qxp 9/30/09 1:23 PM Page 49
debemos modificar las propiedades del fondo (Background), para que se aplique el
color degradado, y las de apariencia, colocando el grosor del borde del control
(BorderThikness) en 1 y el radio de curvatura de las esquinas (CornerRadius) en 10.
Por ltimo, el control MediaElement debe ser contenido por el control que representa
el borde configurado previamente. Para esto, arrastramos el control MediaElement den-
tro del control Border para lograr el efecto deseado. Como podemos editar directamente
XAML, es posible lograr el mismo fin con las siguientes lneas de cdigo:
Por ltimo, es necesario que agreguemos tres botones para las tres acciones antes
definidas. Podremos cambiarle el texto que se va a mostrar en cada botn, presio-
nando dos veces con el puntero del ratn sobre el control, o mediante sus propie-
dades. El resultado debera ser similar al mostrado en la siguiente figura.
49
02_Silverlight.qxp 9/30/09 1:23 PM Page 50
Figura 17. Nuestro visor de videos con los botones que controlarn la reproduccin.
Si necesitamos buscar material sobre desarrollo de interfaces visuales, es posible que tambin
las encontremos mediante la sigla UX (User eXperience o experiencia de usuario, por su signifi-
cado en ingls). Debido a que el trmino, con el tiempo, mut, tendremos ms chances de hallar
informacin mediante este ltimo nombre.
50
02_Silverlight.qxp 9/30/09 1:23 PM Page 51
Si tenemos en cuenta que la lgica debe ser creada en la clase de cdigo C#, necesita-
remos escribir algunas lneas en ella para realizar las acciones propuestas por los tres
botones. Tenemos varios caminos para lograrlo: podramos usar Visual Studio 2008
para generar el cdigo. Visual Studio 2008 es una herramienta de alto nivel para la
creacin de cdigo para aplicaciones, as como para realizar pruebas sobre l. Por otro
lado, sera posible modificar el archivo de clase y el cdigo XAML por nuestra cuen-
ta. Sin embargo, esto puede redundar en un aumento de trabajo y del tiempo de
desarrollo y crear posibles problemas en la confeccin del cdigo, si no somos expe-
rimentados conocedores del lenguaje de programacin utilizado. De cualquier ma-
nera, para este ejemplo, si optamos por la segunda opcin, slo deberemos seguir unos
cuantos pasos. Primero, en el cdigo XAML, tendremos que agregar el atributo
Click=Nombre del Mtodo por cada botn creado. Click representa el evento por el
Expression Blend 2 trae consigo un pequeo servidor de pginas web. Este servidor es activado
en el momento en que queremos depurar nuestro trabajo y ver los resultados obtenidos. Gra-
cias a este servidor, no dependeremos de grandes infraestructuras para desplegar y ejecutar
nuestros proyectos cada vez que necesitemos validar lo que estemos desarrollando.
51
02_Silverlight.qxp 9/30/09 1:23 PM Page 52
Estos tres eventos ahora hacen referencia a tres funciones: Iniciar, Pausar y Detener. Pa-
ra agregar la lgica que maneje estas acciones, necesitamos modificar nuestra clase C#.
Si no contamos con Visual Studio 2008, podremos abrirla con el bloc de notas o cual-
quier editor de texto. El resultado final debera ser como el que sigue:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace SilverlightApplication2
{
public partial class Page : UserControl
{
public Page()
{
52
02_Silverlight.qxp 9/30/09 1:23 PM Page 53
}
}
}
En el cdigo anterior, vemos cmo una simple lnea de cdigo por accin pue-
de ejecutar, pausar o detener el video. Si volvemos a ejecutar nuestra aplicacin
Silverlight, deberemos poder interactuar con el video seleccionado mediante los
botones, inicindolo, detenindolo y pausndolo.
RESUMEN
Expression Blend 2 es una herramienta altamente flexible que une dos reas del desarrollo
de software que haban estado separadas y con falta de comunicacin. De esta forma les da
tanto a los diseadores como a los desarrolladores una forma de comunicarse para que los
primeros puedan ver plasmadas sus ideas en las aplicaciones tal cual las han concebido, y los
desarrolladores implementen estas ideas sin la necesidad de reescribir cdigo, para no
invertir tiempo y esfuerzo de manera innecesaria.
53
02_Silverlight.qxp 9/30/09 1:23 PM Page 54
ACTIVIDADES
1 Cul es, en el desarrollo web, el principal 1 Ingrese y navegue por Quince (http://
problema con el que se encuentra un desa- quince.infragistics.com), el sitio web de
rrollador al recibir el trabajo del diseador Infragistics dedicado a la mejora de las in-
para ser implementado? terfaces visuales.
54
03_Silverlight.qxp 9/30/09 1:29 PM Page 55
Silverlight Captulo 3
El mejor trabajo,
con la mejor
herramienta
Ms all de nuestro conocimiento,
En esta figura, se muestra una lista de componentes que pueden ser descargados.
El primero hace referencia al motor o plugin de Silverlight. Este motor es el que
56
03_Silverlight.qxp 9/30/09 1:29 PM Page 57
debe instalar todo usuario que quiera ver las aplicaciones Silverlight desde el na-
vegador. Por supuesto, no es necesario que proveamos por nuestra cuenta este
plugin ni que tengamos que instalarlo de forma manual en cada uno de los equi-
pos y de los navegadores que quieran nuestro producto ya que, en la declaracin
del objeto Silverlight en el cdigo HTML, se incluye una comprobacin de ver-
siones, adems de indicarle al navegador de dnde obtener esta versin:
, QU ES SILVERLIGHT EN REALIDAD?
Este software no es un componente para realizar presentaciones vistosas en Internet. Por el con-
trario, Silverlight no slo cumple con esta caracterstica, sino que extiende el desarrollo de apli-
caciones profesionales al ambiente web con contenido dinmico. Podemos usar Silverlight, en
especial, cuando tengamos que resolver problemas complejos desde la Web.
57
03_Silverlight.qxp 9/30/09 1:29 PM Page 58
Al momento de escribir este libro, se realiz el anuncio por parte de Microsoft de la nueva
versin de Silverlight: Silverlight 3, versin que se encuentra en etapa beta. Si instalamos
esta versin, no podremos seguir trabajando con la 2, que es la utilizada en este libro. Es re-
comendable usar mquinas virtuales para instalar versiones beta.
58
03_Silverlight.qxp 9/30/09 1:29 PM Page 59
59
03_Silverlight.qxp 9/30/09 1:29 PM Page 60
De todas maneras, si bien es posible utilizar esta herramienta para realizar todo el
proceso, al mismo tiempo el desarrollador no debe olvidar la interfaz visual, ya que
su cdigo tendr que adaptarse a las necesidades que se pudieran plantear tanto por
el usuario como por el diseador. Como dijimos en captulos anteriores, siempre se-
r preferible, dentro del grupo de desarrollo o produccin de software, contar con
las habilidades y roles necesarios para generar el producto, dejando que cada uno,
desde su rol y experiencia, realice el trabajo designado. Entonces, hacer uso de las dos
herramientas, Visual Studio 2008 y Expression Blend 2, crear un ambiente de de-
sarrollo ideal, porque tiene en cuenta los roles involucrados y preocupados por satis-
facer las necesidades de sus reas de inters, las cuales representan, en cierta medida,
las necesidades del cliente. Como resultado, se obtendr una mejor experiencia por
cada una de las partes involucradas, ya que cada una estar enfocada en resolver el
dominio de su problema y no, el de otros. Con esto queremos destacar que, si bien
el desarrollador se encarga de la lgica y del cdigo, no debera olvidar lo relaciona-
do con interfaces grficas, por lo que tener conocimientos de Expression Blend 2,
aunque sea en menor medida que de Visual Studio 2008, le otorgar mayor criterio
a la hora de entender e implementar lo que el diseador grfico le proporcione.
Con Visual Studio 2008, no slo podremos crear aplicaciones Silverlight, sino que
adems nos es posible enriquecerlas desde el punto de vista del cdigo. En la barra
de herramientas, notaremos que existen controles y componentes que no son mos-
trados en Expression Blend 2. Esto se debe a que los componentes, como Calendar,
DataGrid o DatePicker, son ideales para la interaccin con datos y slo se muestran
desde el inicio para los desarrolladores, aunque no para los diseadores, lo que no
significa que no podamos utilizarlos desde Expression Blend 2. Si exploramos con
mayor profundidad dentro de las aplicaciones Silverlight creadas desde Visual
60
03_Silverlight.qxp 9/30/09 1:29 PM Page 61
61
03_Silverlight.qxp 9/30/09 1:29 PM Page 62
Por ltimo, una de las capacidades ms importantes que tiene Visual Studio 2008
cuando trabajamos con aplicaciones Silverlight es la depuracin de cdigo en
tiempo de ejecucin. Con esta caracterstica, heredada del desarrollo tradicional
de aplicaciones, podremos colocar puntos de interrupcin en nuestro cdigo y
movernos lnea a lnea una vez que la aplicacin est trabajando. La ventaja de
esta posibilidad radica en que, si encontramos un error en tiempo de ejecucin de
nuestra aplicacin, podremos depurarla paso a paso para hallar el problema. Esto
resultara en extremo complicado si tuviramos que hacer el trabajo mediante la
inspeccin de las lneas y el clculo de los estados de las variables y objetos en cada
paso. Para lograrlo, podremos agregar un punto de interrupcin con un clic del
mouse en la parte extrema izquierda de nuestro cdigo por cada lnea en la que
queramos que la ejecucin se detenga.
62
03_Silverlight.qxp 9/30/09 1:29 PM Page 63
Microsoft Visual Studio 2008 no es slo una potente herramienta para el desa-
rrollo de software convencional, sino que, adems, todas sus prestaciones pue-
den ser usadas para el desarrollo de aplicaciones Silverlight. Por esto, as como
el diseador visual encuentra su lugar en Expression Blend 2, los desarrolladores
de cdigo lo harn en Visual Studio 2008.
63
03_Silverlight.qxp 9/30/09 1:29 PM Page 64
alguna aplicacin ASP.net existente o crearemos una pgina de prueba para nues-
tra aplicacin. Si no vemos las plantillas Silverlight disponibles, usamos Visual
Studio 2008 o superior y ya hemos instalado los aditamentos mencionados en el
captulo 1, es necesario asegurarnos de haber seleccionado la versin correcta de
Microsoft .Net Framework desde la lista desplegable en la parte superior dere-
cha del asistente para creacin de proyectos, como podemos ver a continuacin.
Una vez cumplidos los pasos anteriores, Visual Studio nos preguntar sobre la
modalidad que utilizaremos para depurar la aplicacin Silverlight, y nos permi-
tir elegir entre las siguientes opciones:
Crear un nuevo proyecto ASP.net: esta opcin agregar un proyecto adicional del
tipo ASP.net a la solucin e incrustar, de manera automtica, nuestro proyecto
Silverlight a la pgina por defecto. Cuando depuremos la solucin, Visual Studio
abrir la pgina ASP.net para mostrar el componente Silverlight creado por nosotros.
64
03_Silverlight.qxp 9/30/09 1:29 PM Page 65
Generacin automtica de una pgina: en este caso, Visual Studio no crear nin-
guna pgina ni proyecto adicional a la solucin y slo veremos el proyecto
Silverlight en el cual trabajaremos. Cuando intentemos depurar la aplicacin Sil-
verlight, Visual Studio crear una pgina de manera dinmica en la que podremos
ver y probar el funcionamiento de nuestro componente Silverlight.
Vincular el control Silverlight: si ya contamos con un sitio web previamen-
te creado, podremos usar esta opcin para vincular el proyecto Silverlight con
aqul y depurarlo basado en esta implementacin existente. Deberemos selec-
cionar esta opcin cuando queramos trabajar en forma directa sobre nuestras
implementaciones web y hacer interactuar nuestro proyecto Silverlight con el
ambiente real donde ser desplegado.
La lista de lenguajes disponibles en Visual Studio vara sobre la base de los que hayamos insta-
lado junto con la herramienta. En una instalacin tpica, podremos elegir entre Visual C++, C#,
Visual Basic.net y J#. Para poder usar lenguajes de otros fabricantes, deberemos adquirirlos
desde sus respectivas pginas webs.
65
03_Silverlight.qxp 9/30/09 1:29 PM Page 66
<UserControl x:Class=SilverlightApplication1.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300>
<Grid x:Name=Layout Background=White>
</Grid>
</UserControl>
La principal desventaja que presenta trabajar con Visual Studio 2008 es que no po-
dremos modificar el lienzo directamente, como en el caso de Expression Blend 2,
sino que deberemos trabajar todo desde el cdigo XAML, lo que requerir de no-
sotros mayor dominio de ste para conseguir el resultado final.
Figura 11. Vista inicial de una aplicacin Silverlight creada con Visual Studio 2008.
Visual Studio 2008 tiene la particularidad de soportar el desarrollo para diferentes versiones de
.Net Framework. Gracias a ello, se convierte en una herramienta verstil, que permite editar
proyectos creados en versiones anteriores de Visual Studio as como crear proyectos para ver-
siones previas a la ltima versin del Framework.
66
03_Silverlight.qxp 9/30/09 1:29 PM Page 67
En este ejemplo, haremos uso del contenedor Grid para agrupar y ordenar nuestros
elementos. Por un lado, necesitaremos alguna forma de permitir que el usuario
escriba lo que quiere buscar, capturando dicha entrada y proporcionando la posi-
bilidad de activar la bsqueda. Esto podemos conseguirlo mediante un compo-
nente TextBox y un componente Button. Estos controles deberemos alinearlos de tal
manera que se vean uno al lado del otro. Para conseguir este efecto, agregaremos un
par de filas y de columnas al contenedor Grid inicial de la siguiente manera:
<Grid.RowDefinitions>
<RowDefinition Height=40/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
</Grid>
En los captulos se hace referencia a controles y componentes. stos deben ser entendidos como
piezas de software, cdigo funcional encapsulado para su posterior reutilizacin. Los controles
suelen tener comportamiento visual mientras que los componentes, no.
67
03_Silverlight.qxp 9/30/09 1:29 PM Page 68
68
03_Silverlight.qxp 9/30/09 1:29 PM Page 69
Este DataGrid tambin necesitar ser asignado a una fila y a una columna dentro
de la grilla general, de la siguiente manera:
Una vez ms, los atributos Grid.Row y Grid.Column son utilizados para posicio-
nar este componente en una de las celdas de la grilla, aunque en este caso apa-
rece un nuevo atributo llamado Grid.ColumnSpan. Este atributo es necesario para
decirle al DataGrid que debe emplear u ocupar las dos columnas de la fila en la
cual se encuentra. Si obviramos este parmetro, obtendramos un resultado no
deseado, como podemos ver en la figura de la siguiente pgina.
RRR NUEVO C#
Como estamos trabajando con la ltima versin del lenguaje C#, encontraremos mejoras que
facilitarn la rpida escritura del cdigo. En la versin 2008 del lenguaje, no se requiere que
escribamos el contenido de los get y set en las propiedades y sus respectivas variables privadas,
ya que lo har por nosotros cuando se genere el programa.
69
03_Silverlight.qxp 9/30/09 1:29 PM Page 70
Intellisense resulta extremadamente til para completar cdigo. Desde Visual Studio podemos
activarlo con la combinacin CTRL+J. En el desarrollo de aplicaciones Silverlight no slo es
posible usar Intellisense en cdigo C#, tambin est disponible para cdigo XAML.
70
03_Silverlight.qxp 9/30/09 1:29 PM Page 71
{
get;
set;
}
El siguiente paso es enlazar el evento click del botn a nuestro cdigo C#. Podemos
hacerlo con facilidad desde el cdigo XAML de nuestra aplicacin, si escribimos el
nombre del evento en el botn y dejamos que Visual Studio complete el cdigo
cuando presionamos la tecla TAB, como podemos ver en la siguiente figura.
71
03_Silverlight.qxp 9/30/09 1:29 PM Page 72
}
}
RRR EVENTOS
Todos los controles en Silverlight poseen una serie de eventos. Estos eventos representan si-
mulaciones de acciones reales en la interfaz grfica. El clic del ratn, una tecla presionada, el
conteo de un reloj son reacciones a cuestiones cotidianas de las aplicaciones. A estas reaccio-
nes, las llamamos eventos.
72
03_Silverlight.qxp 9/30/09 1:29 PM Page 73
public Page()
{
InitializeComponent();
CargarLista();
}
productos.Add(new producto()
{
ID_Producto = 2,
Nombre = PC Superior,
Descripcion = PC de escritorio superior,
Precio = 3500,
Stock = 50
});
productos.Add(new producto()
{
ID_Producto = 3,
Nombre = PC Notebook,
Descripcion = PC tipo Notebook,
Precio = 2500,
Stock = 40
});
73
03_Silverlight.qxp 9/30/09 1:29 PM Page 74
productos.Add(new producto()
{
ID_Producto = 4,
Nombre = PC NetBook,
Descripcion = PC tipo NetBook,
Precio = 2000,
Stock = 450
});
productos.Add(new producto()
{
ID_Producto = 5,
Nombre = SmartPhone,
Descripcion = Telfono SmartPhone,
Precio = 500,
Stock = 55
});
}
Una vez cargados los elementos en la lista, slo nos queda realizar la bsqueda
sobre la base de las entradas del usuario. Para acelerar las consultas, usaremos
LinQ sobre colecciones. La funcin enlazada al evento click del botn deber
tener un aspecto similar al siguiente:
this.GrillaDeProductos.ItemsSource = q;
}
74
03_Silverlight.qxp 9/30/09 1:29 PM Page 75
75
03_Silverlight.qxp 9/30/09 1:29 PM Page 76
Es recomendable que siempre tengamos instalado Expression Blend 2 en nuestro equipo cuando
desarrollemos aplicaciones Silverlight. Sin importar si slo nos dedicamos a la produccin de
cdigo, esta herramienta nos ayudar a acelerar la produccin de cdigo XAML y nos facilitar
la creacin de contenido visual.
76
03_Silverlight.qxp 9/30/09 1:29 PM Page 77
con Expression Blend 2, lo nico que necesitamos es seleccionar la pgina XAML por
editar y, con el botn secundario del mouse, pulsar Abrir en Expression Blend.
77
03_Silverlight.qxp 9/30/09 1:29 PM Page 78
Podramos ejecutar la aplicacin desde Expression Blend 2 para ver sus resultados,
aunque en este caso, una vez guardados los cambios, cerraremos esta aplicacin y vol-
veremos a Visual Studio 2008. Si ste ha detectado cambios en el XAML, nos pedir
autorizacin para recargar el contenido. En este caso, aceptaremos las modificaciones
ya que representan los cambios realizados. Una vez que la aplicacin haya sido recar-
gada, depuramos el cdigo presionando la tecla F5. Luego, si inspeccionamos el cdi-
go XAML del DataGrid generado por Expression Blend 2, notaremos cambios:
78
03_Silverlight.qxp 9/30/09 1:29 PM Page 79
RESUMEN
Visual Studio 2008 brinda al desarrollador elementos para acelerar la produccin de cdigo,
as como tambin controles y componentes exclusivos para la resolucin de problemas
planteados en el proceso de produccin del software. Visual Studio 2008 tambin deja
modificar la parte visual con herramientas externas como Expression Blend 2. Demuestra as
su versatilidad en el desarrollo de software y permite compartir visiones entre el productor
de las interfaces grficas y el desarrollador de funcionalidades.
79
03_Silverlight.qxp 9/30/09 1:29 PM Page 80
ACTIVIDADES
80
04_Silverlight.qxp 9/30/09 1:31 PM Page 81
Silverlight Captulo 4
XAML
al extremo
Es necesario tener una referencia de cada
El lenguaje XAML 82
uno de los controles y componentes Qu es XAML? 82
Declaracin de objetos 82
Controles y componentes 83
propuestos por Silverlight. Cada uno
Controles contenedores
y agrupadores 84
de ellos, su declaracin, mtodos, eventos Control Grid 84
Control GridSplitter 89
y uso sern tratados en este captulo, Control Canvas 92
Control StackPanel 95
Control ScrollViewer 98
que servir como un manual
Control Border 101
Controles de interaccin
que nos guiar y ayudar con el usuario 103
Control Button 103
en la construccin de nuestras Control CheckBox 106
Control RadioButton 110
Control HyperlinkButton 113
aplicaciones Silverlight.
Control Image 114
Control ComboBox 117
Control ListBox 124
Control TextBlock 126
Control TextBox 127
Control PasswordBox 130
Control DataGrid 132
Control Calendar 139
Control DatePicker 147
Control ProgressBar 148
Control Slider 152
Resumen 153
SERVICIO DE ATENCIN AL LECTOR: usershop@redusers.com Actividades 154
04_Silverlight.qxp 9/30/09 1:31 PM Page 82
4. XAML AL EXTREMO
EL LENGUAJE XAML
Hasta este momento, ya hemos hablado de Silverlight, su arquitectura, alcances y
restricciones. Hemos usado dos de las principales herramientas para desarrollar
con Silverlight, as como realizado algunos ejemplos iniciales para poder mover-
nos con mayor soltura, adems de entender mejor esta tecnologa. Es momento,
entonces, de hacer un recorrido ms exhaustivo sobre cada uno de los controles y
componentes que podemos encontrar en Silverlight. En este captulo, veremos ca-
da uno de los elementos representados con XAML provistos por Silverlight, sus
propiedades y sus usos elementales desde C#. Esta parte del libro puede ser con-
siderada como una referencia a los controles de Silverlight y XAML.
Qu es XAML?
XAML es un lenguaje declarativo que tiene su raz en el XML. Con XAML, es
posible declarar objetos que representen una interfaz grfica comn entre dife-
rentes plataformas. Uno de los problemas acarreado por las plataformas, ya sean
de escritorio, webs, u otras, as como distintos sistemas operativos, Windows, Linux,
etctera, consiste en la imposibilidad de compartir entre ellas los mismos ele-
mentos visuales que componen la interfaz. Un acercamiento a esta solucin es el
HTML, aunque ste slo es aplicado a la Web, y no se pueden compartir los mis-
mos elementos en aplicaciones de escritorio. XAML, entonces, une bajo el mismo
lenguaje declarativo la posibilidad de utilizar una nica interfaz grfica en diferen-
tes ambientes. En el caso de aplicaciones de escritorio bajo Windows, mediante
WPF, y, en la Web, por medio de Silverlight.
Es necesario tener cierto cuidado cuando escribimos XAML, ya que ste es sensible
a maysculas y minsculas. Esto quiere decir que deberemos prestar mucha aten-
cin cuando queramos usar cualquier control o componente en Silverlight, ya que
un cambio de maysculas a de minsculas har que la aplicacin deje de funcionar.
Declaracin de objetos
Los objetos en XAML pueden ser declarados de diferentes formas. Pero, en cual-
quier caso, un tag inicial deber siempre ser cerrado al terminar de usarlo. Estos
objetos suelen presentar dos formas tradicionales de declaracin.
<Objeto>
</Objeto>
82
04_Silverlight.qxp 9/30/09 1:31 PM Page 83
Controles y componentes
caracteres </, por lo dems, el nombre del objeto de apertura y su sintaxis son idn-
ticos. Esto quiere decir que se respetan las maysculas y minsculas. Tambin es
posible, si el tag lo permite, su apertura y cierre en una sola lnea.
<Objeto />
En el caso anterior, el tag es abierto al comienzo y cerrado al final con los mis-
mos caracteres (/>). Por otro lado, al ser un lenguaje basado en XML, con nodos
y subnodos, si el modelo de objeto lo permite es posible declarar un elemento
dentro de otro, lo que permitir crear elementos mucho ms ricos. Esto adicio-
nar, adems, versatilidad y simpleza en el momento de tener que crear compo-
nentes ms complejos, como botones que presenten como fondo un video y no
un color plano, o agregar casillas de verificacin a una lista desplegable. Podemos
anidar uno o ms elementos de la siguiente forma.
<Canvas>
<Button></Button>
</Canvas>
CONTROLES Y COMPONENTES
A lo largo de los tres primeros captulos, nos hemos encontrado con algunos de los
controles y componentes disponibles en Silverlight: controles contenedores de otros
controles; controles utilizados para mostrar videos, imgenes o datos; as como con-
troles que capturan el comportamiento del usuario sirvindonos de nexo entre ste
y la aplicacin creada. Este comportamiento es iniciado, por lo general, con la
ayuda de un evento. Alguno de estos eventos son comunes a todos los controles
Silverlight y entre ellos podemos encontrar los siguientes:
_` ARCHIVOS HTA
Un intento de acercar la conmutacin de la interfaz grfica entre plataformas fue la creada por
Microsoft por medio de los archivos HTA (HTML Application). Aqu, archivos con tags HTML re-
gulares podan ser ejecutados en Windows sin la necesidad explcita de un navegador web.
83
04_Silverlight.qxp 9/30/09 1:31 PM Page 84
4. XAML AL EXTREMO
GotFocus: este evento se disparar cuando el control tome el foco de la accin. Pue-
de ser usado cuando el usuario navega de un control a otro en nuestra aplicacin
Silverlight, pulsando la tecla TAB o presionando con el ratn.
IsEnabledChanged: si modificamos el estado del control, pasndolo de habilitado
a no habilitado, este evento nos pondr en alerta sobre ese cambio.
KeyDown: en este caso, si el usuario presiona una tecla cuando el control tiene
el foco, el evento se disparar.
KeyUp: accin contraria a la anterior. Este evento se disparar en el momento en
el que la tecla sea liberada. Esto es, cuando el usuario dej de presionarla.
LayoutUpdated: cada vez que exista una modificacin visual en el control, ya sea
por adicin de otro control, movimiento de las barras de desplazamiento o cam-
bio de tamao del control, este evento ser disparado.
LostFocus: sta es la accin opuesta a GotFocus. En el momento en que el con-
trol pierda el foco, el evento nos pondr en alerta.
SizeChanged: si el control se modifica en su tamao, este evento lo comunicar.
Es importante tener presente estos eventos, ya que nos sern de utilidad en la imple-
mentacin de nuestro cdigo y en el comportamiento de la aplicacin. Si bien algunos
eventos son comunes a todos los controles, la declaracin y el uso varan. Veamos
entonces, uno a uno, los controles y lo componentes disponibles, su funcionalidad, su
declaracin sintctica y cmo podemos interactuar con ellos desde nuestro cdigo.
Control Grid
El control Grid, o grilla en castellano, est pensado para la representacin de filas y
columnas dentro del lienzo de dibujo de Silverlight. Debemos usar este control
cuando necesitemos organizar, de forma estructurada, otros controles Silverlight,
colocando dentro de cada celda de la grilla el o los controles adicionales. Pensemos
en este control como si fuera una planilla de clculo o, para aquellos desarrollado-
res web, en el tag <Table>, con sus <TR> y <TD> usados en el HTML.
La declaracin inicial de un control Grid es simple:
<Grid x:Name=[NombreDelControl]>
</Grid>
84
04_Silverlight.qxp 9/30/09 1:31 PM Page 85
Controles y componentes
El tag <Grid> marca el inicio del control Grid, y debe ser cerrado con su tag finalizador
</Grid>. Todos los controles contenidos por el elemento Grid debern ser escritos en-
tre estos dos tags. Es importante, pero no obligatorio, asignarle un nombre por medio
del atributo x:Name al control Grid (deberemos hacerlo si necesitamos manipularlo en
tiempo de ejecucin). Tenemos que declarar las filas y las columnas al inicio de nues-
tro control Grid, pudiendo especificar tantas filas y columnas como necesitemos:
<Grid x:Name=[NombreDelControl]>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
</Grid>
Una celda, en un control del tipo Grid, se encuentra conformada por la unin de sus filas y de
sus columnas. El resultado de unir estos dos elementos arrojar un espacio para colocar otros
controles o una celda. Es necesario el par columna y fila para poder obtener esta celda.
85
04_Silverlight.qxp 9/30/09 1:31 PM Page 86
4. XAML AL EXTREMO
<Grid.ColumnDefinitions>
<ColumnDefinition Width=60/>
<ColumnDefinition Width=50*/>
<ColumnDefinition Width=20/>
</Grid.ColumnDefinitions>
86
04_Silverlight.qxp 9/30/09 1:31 PM Page 87
Controles y componentes
Sobre las filas, es posible configurar el alto (Height) como en el siguiente cdigo:
<Grid.RowDefinitions>
<RowDefinition Height=70*/>
<RowDefinition Height=70/>
</Grid.RowDefinitions>
Con caractersticas idnticas a las nombradas para las columnas, podremos usar
el comodn * para modificar el alto de las filas de manera dinmica. Si no espe-
cificamos un valor para el alto y el ancho a nivel del tag de la grilla, sta asumir
que debe ocupar la totalidad definida por el contenedor. Podremos modificar es-
tos valores agregando en forma manual estos valores:
87
04_Silverlight.qxp 9/30/09 1:31 PM Page 88
4. XAML AL EXTREMO
contorno de la grilla, sus filas y columnas. Por su parte, Cursor configura el tipo
de puntero de mouse que se va a mostrar cuando ste se pase por encima del con-
trol de grilla, pudiendo elegir entre Arrow (flecha), Eraser (borrador), Hand (ma-
no), IBean (smbolo de escritura), None (sin icono), SizeNS (cambio de tamao
norte/sur), SizeWE (cambio de tamao oeste/este), Stylus (punto de lpiz) y Wait
(reloj de arena de espera). Por ltimo, ToolTipService.ToolTip permite mostrarle
al usuario mensajes emergentes temporales cuando el mouse se posiciona duran-
te determinado tiempo sobre el control de grilla. En el siguiente cdigo, se apli-
can todos los elementos mencionados:
<Grid x:Name=[NombreDelControl]
ShowGridLines=True Cursor=Eraser
ToolTipService.ToolTip=Mi grilla
Width=200 Height=200>
<Grid.RowDefinitions>
<RowDefinition Height=70*/>
<RowDefinition Height=70/>
...
...
El cdigo anterior deber mostrar las lneas que delimitan la grilla, un mensaje
desplegable y un cursor con forma de borrador. Todo esto, lo podemos observar
en la imagen que aparece a continuacin.
88
04_Silverlight.qxp 9/30/09 1:31 PM Page 89
Controles y componentes
<Grid x:Name=[NombreDelControl]
ShowGridLines=True Cursor=Eraser
ToolTipService.ToolTip=Mi grilla
HorizontalAlignment=Stretch VerticalAlignment=Stretch>
<Grid.RowDefinitions>
<RowDefinition Height=70*/>
Control GridSplitter
GridSplitter no es un contenedor por s solo, sino que se conjuga conel control
Grid para poder manipular las columnas de este control y desplazarlaslibremen-
te. Para poder utilizarlo, en primer lugar, deberemos configurar una grilla que
89
04_Silverlight.qxp 9/30/09 1:31 PM Page 90
4. XAML AL EXTREMO
Podemos intentar la configuracin del atributo HorizontalAlignment con el valor Stretch y el atri-
buto VerticalAlignment con el valor Top. Con esta accin, haremos que la grilla ocupe toda la
parte superior del contenedor, dejando espacio en la parte inferior.
90
04_Silverlight.qxp 9/30/09 1:31 PM Page 91
Controles y componentes
los valores mnimos y mximos, en este orden, a los que podr encogerse o esti-
rarse dicha columna por accin del control GridSplitter. En la figura siguiente,
podemos ver estos elementos funcionando.
91
04_Silverlight.qxp 9/30/09 1:31 PM Page 92
4. XAML AL EXTREMO
<basics:GridSplitter x:Name=miGridSplitterHorizontal
Grid.ColumnSpan=3 Grid.Row=1 Grid.Column=0
HorizontalAlignment=Stretch VerticalAlignment=Center
Background=#FFDD7676 Height=5></basics:GridSplitter>
</Grid>
Control Canvas
El control Canvas es el ms simple de los contenedores. Su trabajo, como conte-
nedor, es el de incluir otros controles sin una estructura especfica. El siguiente
cdigo muestra la declaracin del control Canvas:
<Canvas x:Name=[NombreDelControl]>
</Canvas>
92
04_Silverlight.qxp 9/30/09 1:31 PM Page 93
Controles y componentes
El objetivo del control Canvas es el de poder agrupar, de forma simple, otros ele-
mentos Silverlight. De esta forma, alterando el comportamiento del control Canvas,
podremos alterar el de todos los controles contenidos en l. Podemos aplicar una
transformacin al control Canvas para distorsionarlo, como vemos a continuacin.
93
04_Silverlight.qxp 9/30/09 1:31 PM Page 94
4. XAML AL EXTREMO
Como vemos en el cdigo anterior, los botones apuntan a dos eventos manejados
por C#. Este cdigo oculta y muestra el control Canvas, ocultando y mostrando, a
su vez, todos los controles contenidos por l.
94
04_Silverlight.qxp 9/30/09 1:31 PM Page 95
Controles y componentes
Control StackPanel
Es posible que necesitemos crear una pila de controles, esto es, una sucesin de con-
troles Silverlight que ocupen todo el espacio designado para ste, tanto en ancho como
en alto. Pensemos en controles apilados, uno arriba del otro o uno al lado del otro.
Es posible conseguir esto mediante el control StackPanel. Por lo comn, usaremos
el control StackPanel dentro de otros controles contenedores como vimos en el caso
del control Canvas. Para declarar un control StackPanel, usaremos el siguiente cdigo:
<StackPanel x:Name=[NombreDelControl]>
</StackPanel>
95
04_Silverlight.qxp 9/30/09 1:31 PM Page 96
4. XAML AL EXTREMO
96
04_Silverlight.qxp 9/30/09 1:31 PM Page 97
Controles y componentes
Es importante resaltar que este atributo debe ser declarado dentro del tag StackPanel,
como vemos en el cdigo que aparece a continuacin:
En el cdigo anterior, hemos agregado un control Grid con una fila y una columna.
Dentro de la celda creada, un StackPanel y, dentro de ste, un botn. Este botn
disparar un evento en C# con el siguiente cdigo:
Cuando el usuario presiona el botn inicial, ste crear una nueva instancia de
un control TextBox, le configurar un texto por mostrar y lo adicionar a la lis-
ta de controles contenidos por el StackPanel. Podemos ver el resultado de pulsar
varias veces el botn en la figura de la siguiente pgina.
97
04_Silverlight.qxp 9/30/09 1:31 PM Page 98
4. XAML AL EXTREMO
Control ScrollViewer
El control ScrollViewer es un contenedor que tiene la capacidad de mostrar barras
de desplazamientos, tanto verticales como horizontales, dependiendo de su conte-
nido. Declaramos un control ScrollViewer de la siguiente forma:
<ScrollViewer x:Name=[NombreDelControl]>
</ScrollViewer>
Disabled: esta propiedad har que, sin importar el contenido que tenga el control
ScrollViewer, las barras de desplazamiento no se muestren.
Auto: en este caso, la presencia de las barras depende del contenido. Si ste sobre-
pasa las dimensiones propuestas por el ScrollViewer, las barras de desplazamientos
se mostrarn de manera automtica. De esta forma pueden estar visibles o no.
Hidden: en este caso, la barra de desplazamiento no se mostrar, pero el conteni-
do creado dentro del control ScrollViewer que exceda el tamao del contenedor
tampoco ser visible. Esta propiedad es til cuando queramos sincronizar dos
98
04_Silverlight.qxp 9/30/09 1:31 PM Page 99
Controles y componentes
<ScrollViewer x:Name=[NombreDelControl]
HorizontalScrollBarVisibility=[Disabled | Auto | Hidden | Visible]
VerticalScrollBarVisibility=[Disabled | Auto | Hidden | Visible]>
</ScrollViewer>
99
04_Silverlight.qxp 9/30/09 1:31 PM Page 100
4. XAML AL EXTREMO
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=100/>
<ColumnDefinition Width=150/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Button Content=Crear elementos VerticalAlignment=Top
Click=Button_Click/>
<ScrollViewer x:Name=Scroll1 Grid.Column=1
HorizontalScrollBarVisibility=Visible
VerticalScrollBarVisibility=Hidden>
<StackPanel x:Name=MiStackPanel>
</StackPanel>
</ScrollViewer>
<ScrollViewer x:Name=Scroll2 Grid.Column=2
HorizontalScrollBarVisibility=Visible
VerticalScrollBarVisibility=Visible
LayoutUpdated=Scroll2_LayoutUpdated>
<StackPanel x:Name=SegundoStackPanel>
</StackPanel>
</ScrollViewer>
</Grid>
Notemos que tanto al botn como a uno de los controles ScrollViewer se les han
agregado eventos. En el caso del botn, el cdigo crear controles de manera di-
nmica para ser agregados a los controles StackPanel que estn contenidos por
los ScrollViewer. En el caso del control ScrollViewer, el evento actualizar la po-
sicin de las barras de desplazamiento del primer ScrollViewer cada vez que ste
se actualice. Podemos ver el cdigo C# a continuacin:
100
04_Silverlight.qxp 9/30/09 1:31 PM Page 101
Controles y componentes
this.SegundoStackPanel.Children.Add(textBox2);
}
Control Border
El control Border es el ms simple de los controles, aunque puede resultar extre-
madamente til. Como su nombre en ingls lo indica, el control Border (borde o
contorno) marca un borde a lo que contiene. Ya lo hemos usado en el captulo 2 al
crear un contorno para la pelcula en nuestro visor de videos. De cualquier mane-
ra, este control posee otros atributos que resultan tiles. Es posible asignarle un
grosor a cada lado del borde, as como crear esquinas redondeadas. A continua-
cin podemos ver la declaracin de un control Border:
101
04_Silverlight.qxp 9/30/09 1:31 PM Page 102
4. XAML AL EXTREMO
<Border x:Name=[NombreDelControl]>
</Border>
, SMBOLO DE CORCHETE
Los smbolos de corchetes usados en el cdigo de ejemplo representan elementos que deben
ser reemplazados en el momento de la escritura del cdigo real. Debemos cambiar estos valo-
res por aquellos que sean convenientes para la aplicacin que estemos realizando.
102
04_Silverlight.qxp 9/30/09 1:31 PM Page 103
Controles y componentes
Control Button
El control Button o botn es uno de los ms conocidos y, prcticamente, lo en-
contramos en todas las interfaces visuales. Posee como objetivo principal el de
disparar acciones por parte del usuario. Su declaracin es intuitiva, como po-
demos ver en el cdigo que aparece a continuacin:
El atributo Content hace referencia al texto que se mostrar en el interior del con-
trol. La funcin primordial del control Button es la de poder capturar el clic del
mouse y as disparar un evento para que nuestra pieza de cdigo reaccione a ste.
Podremos enlazar este evento a nuestro cdigo agregando el atributo Click a la
descripcin del control ms el nombre de la funcin en nuestro cdigo C# que se
utilizar para ejecutar el evento en cuestin.
La funcin por utilizar debe seguir una firma o contener una serie de parmetros
exactos; sin esta firma, el evento no podr ser enlazado en forma correcta.
El elemento sender de tipo object contiene el objeto ejecutor del evento. Este
parmetro es importante, ya que podramos tener asociados a la misma funcin
diferentes eventos Click de distintos botones. En el siguiente cdigo, se crean tres
controles del tipo Button desde nuestro cdigo, asociando cada uno de ellos a la
misma funcin creada con anterioridad. Cada vez que se dispare el evento de
cualquiera de los botones, se tomar ese texto, haciendo uso del objeto sender, para
informar qu botn realiz la accin. Primero declaramos el cdigo XAML:
103
04_Silverlight.qxp 9/30/09 1:31 PM Page 104
4. XAML AL EXTREMO
104
04_Silverlight.qxp 9/30/09 1:31 PM Page 105
Controles y componentes
Figura 15. Lista de controles creados en forma dinmica con eventos asociados.
RRR CONTENEDORES
Cuando trabajamos con contenedores, debemos tener en cuenta que es posible colocar slo un con-
tenedor por pgina Silverlight. Si bien se pueden anidar controles del tipo contenedor, solamente
debe existir uno a nivel general, es decir, ubicado entre los tags <UserControl></UserControl>.
105
04_Silverlight.qxp 9/30/09 1:31 PM Page 106
4. XAML AL EXTREMO
<Button x:Name=[NombreDelControl]>
<Image Height=[Alto en pxeles] Width=[Ancho en pxeles]
Source=[Nombre de la imgen]/>
</Button>
En la siguiente figura, es posible ver el nuevo botn usando una imagen como
cara visible. Cabe destacar que el comportamiento de eventos en el botn ser
exactamente igual que un botn sin otro elemento anidado.
Control CheckBox
Este control, conocido tambin como de casilla de verificacin, presenta, tpica-
mente, un cuadrado donde el usuario puede marcar o desmarcar la casilla. Para de-
clarar un control CheckBox, podremos hacerlo de la siguiente forma:
106
04_Silverlight.qxp 9/30/09 1:31 PM Page 107
Controles y componentes
<CheckBox
Content=C# IsThreeState=True
HorizontalContentAlignment=Left/>
Tambin es posible especificar que el control est en estado verificado por defecto,
haciendo uso del atributo IsChecked con su valor igual a True.
<CheckBox
Content=C# IsChecked=True
HorizontalContentAlignment=Left/>
Este control puede poseer cuatro eventos para disparar por cada uno de los estados.
107
04_Silverlight.qxp 9/30/09 1:31 PM Page 108
4. XAML AL EXTREMO
108
04_Silverlight.qxp 9/30/09 1:31 PM Page 109
Controles y componentes
Si bien podemos usar los eventos para recuperar informacin de los controles,
existirn casos donde estos eventos no sean necesarios, pero s conocer el estado
de los controles por medio de nuestro cdigo. Para poder acceder al control, es
necesario asignarle un nombre descriptivo.
<CheckBox
Content=Visual Basic.Net IsThreeState=True
HorizontalContentAlignment=Left Click=CheckBox_Click
Checked=CheckBox_Checked Indeterminate=CheckBox_Indeterminate
Unchecked=CheckBox_Unchecked x:Name=VBCheckBox/>
Una vez nombrado el control, podremos usar la propiedad IsChecked para accede al
valor actual del elemento. Esta propiedad es un valor del tipo Verdadero/Falso que,
adems, cuenta con el atributo Nulleable, lo que significa que puede mantener tres
109
04_Silverlight.qxp 9/30/09 1:31 PM Page 110
4. XAML AL EXTREMO
estados, True (verdadero), False (falso) y Null (nulo). Estos tres valores representan
los tres posibles estados del control, siendo verdadero para el estado verificado,
falso para no verificado y nulo para indeterminado. Como se observa a continua-
cin, el estado del control CheckBox se escribe en la consola de depuracin.
System.Diagnostics.Debug.WriteLine(CheckBox verificado: +
this.VBCheckBox.IsChecked.ToString());
Control RadioButton
El control RadioButton extiende la funcionalidad del control CheckBox antes visto.
Si bien ste se presenta como una casilla de verificacin, el formato visual tradicional
es de un crculo, donde puede ser seleccionado uno de stos en un grupo de con-
troles similares. El control RadioButton tiene el objetivo de presentar opciones de
manera grupal, donde el usuario pueda seleccionar una de ese grupo, a diferencia
del CheckBox, donde el usuario puede seleccionar tantas opciones como crea con-
veniente. Podemos declarar un control RadioButton de la siguiente forma:
Como hemos dicho, el objetivo de este control es el trabajo en conjunto con otros
similares de manera grupal. Para lograr este efecto, es necesario especificar, para cada
control RadioButton, el nombre del grupo al cual pertenece. Todos los controles
RadioButton con el mismo grupo actuarn como una unidad, pasando del estado
verificado a no verificado en forma automtica. Para configurar un grupo, debere-
mos usar el atributo GroupName, colocando el nombre del grupo correspondiente.
El cdigo anterior muestra cmo podemos agrupar dos controles RadioButton me-
diante el atributo GroupName. Si colocamos los dos controles dentro del mismo grupo,
obtendremos el resultado de la figura en la pgina siguiente.
110
04_Silverlight.qxp 9/30/09 1:31 PM Page 111
Controles y componentes
111
04_Silverlight.qxp 9/30/09 1:31 PM Page 112
4. XAML AL EXTREMO
De esta forma, tenemos dos grupos, uno definido por el valor Sexo y otro por Edad.
Al seleccionar cualquiera de los elementos de un grupo, stos trabajarn de ma-
nera independiente o en relacin con su grupo.
Este control posee eventos similares al del control CheckBox. Es posible enlazar
eventos a la accin de presionado del mouse y al cambio de su estado. Como las
posibilidades del control RadioButton son ms limitadas que las del control CheckBox,
APRENDIENDO SOBRE UX
Dentro de la librera de recursos provista por Microsoft en la Web, podremos encontrar una
seccin que hace referencia a la aplicacin de reglas, recomendaciones y otros elementos re-
lacionados con el momento del desarrollo de aplicaciones para Windows. Para poder ingresar
en este sitio, deberemos navegar a la siguiente direccin: http://msdn.microsoft.com/.
112
04_Silverlight.qxp 9/30/09 1:31 PM Page 113
Controles y componentes
Control HyperlinkButton
El control HyperlinkButton es uno de los controles ms simples de manipular. Su
objetivo consiste en proveer de un enlace o vnculo para navegar desde nuestra apli-
cacin hacia otra direccin web. Teniendo en cuenta que las aplicaciones Silverlight
son hospedadas por los navegadores web en un ambiente web, este control resulta
fundamental en cualquier proyecto que llevemos a cabo. Cuenta con dos atributos
primarios: Content, como en controles anteriores, es usado para desplegar el texto
que mostrar el control; y NavigateUri contiene el valor de la URL o pgina adon-
de el navegador web se dirigir. A continuacin, veamos un ejemplo:
113
04_Silverlight.qxp 9/30/09 1:31 PM Page 114
4. XAML AL EXTREMO
Control Image
El control Image presenta un comportamiento particular. Si bien es utilizado pa-
ra desplegar imgenes en nuestras aplicaciones Silverlight, este control nos per-
mite visualizar imgenes que estn contenidas tanto en nuestra aplicacin como
en cualquier otra direccin web vlida. La diferencia de estas dos posibilidades
radica en el tamao del archivo generado por nuestra aplicacin y qu cantidad de
informacin estaremos dispuestos a transferir al cliente que la consuma. Pensemos
que las imgenes adicionadas a nuestros proyectos Silverlight son empaquetadas
dentro del archivo de aplicacin de Silverlight, y ste debe ser descargado por
completo antes de poder ejecutarse. Como vemos en la figura que aparece deba-
jo, el archivo logo.jpg es incluido en el proyecto para luego ser visualizado por el
control Image desde el mismo archivo.
114
04_Silverlight.qxp 9/30/09 1:31 PM Page 115
Controles y componentes
Por lo dicho antes, es necesario encontrar un balance entre los archivos de im-
genes que vamos a incluir dentro del proyecto y aquellos que deberemos consumir
de manera dinmica desde otro recurso de red. Para declarar un control Image,
podemos hacerlo con el siguiente cdigo:
115
04_Silverlight.qxp 9/30/09 1:31 PM Page 116
4. XAML AL EXTREMO
<Image Source=logo.jpg></Image>
<Image Source=http://www.redusers.com/wp-
content/themes/redusers/images/logo.jpg Grid.Row=1></Image>
</Grid>
En el cdigo anterior, hemos colocado dos controles Image, uno que utiliza una ima-
gen incluida en el mismo proyecto Silverlight y la segunda que consume la misma
imagen desde su origen web. En la siguiente figura, podemos ver el resultado.
Este control tambin cuenta con un atributo llamado Stretch, que es utilizado para
configurar el comportamiento de la imagen sobre la base del tamao elegido para
el control Image. Los valores del atributo Stretch pueden ser los siguientes:
None: este atributo no aplicar ningn cambio a la imagen contenida por el con-
trol Image y la mostrar en su tamao original, incluso, cortando partes de sta si
es ms grande que su contenedor.
Fill: sin importar el tamao original de la imagen, sta se ajustar al contenedor
Image para ocupar o rellenar por completo el tamao del control. Esto puede cau-
sar la deformacin de la imagen.
Uniform: al igual que Fill, esta propiedad rellenar todo el contenedor con la ima-
gen, pero ajustndola sin deformarla.
UniformToFill: este valor es la conjuncin de los dos anteriores. Ajusta la imagen
para que llene por completo el contenedor sin deformarla.
116
04_Silverlight.qxp 9/30/09 1:31 PM Page 117
Controles y componentes
Figura 24. Aplicando los cuatro modificadores posibles para el control Image.
Control ComboBox
El objetivo del control ComboBox es el de brindarle al usuario la posibilidad de elegir
un elemento de entre un conjunto de elementos o lista de stos. Como todos los con-
troles comnmente usados en el desarrollo de software, entre sus objetivos est el de
optimizar las interfaces grficas para brindar una mejor experiencia al usuario. Parte
de esta optimizacin radica en la capacidad de reducir los elementos o controles
117
04_Silverlight.qxp 9/30/09 1:31 PM Page 118
4. XAML AL EXTREMO
<ComboBox x:Name=[NombreDelControl]>
</ComboBox>
Como el ComboBox representa una lista de elementos entre los que se debe elegir
alguno, es necesario que agreguemos tantos elementos como necesitemos mostrar,
entre los cuales el usuario seleccionar. Para hacer esto, deberemos incluir el tag
<ComboBoxItem> dentro del tag representativo del control ComboBox.
El cdigo anterior genera un control ComboBox con cinco elementos, que se mostrarn
en una lista desplegable al momento de presionar sobre la flecha derecha del control.
Figura 25. ComboBox desplegado para seleccionar uno de los tems de la lista.
118
04_Silverlight.qxp 9/30/09 1:31 PM Page 119
Controles y componentes
Una vez seleccionado un tem de la lista, es posible saber cul de los elementos lista-
dos es el que fue seleccionado. Esto es til para recolectar los valores elegidos por el
usuario en la aplicacin. Para comprobar cul ha sido el elemento marcado, prime-
ro deberemos asignarle un nombre al control ComboBox ya que, de esta forma, lo ac-
cederemos desde nuestro cdigo. El siguiente cdigo XAML muestra cmo hacerlo:
119
04_Silverlight.qxp 9/30/09 1:31 PM Page 120
4. XAML AL EXTREMO
Si bien podemos agregar tems por medio de la escritura de XAML como en el ejem-
plo anterior, es posible adicionar nuevos elementos desde nuestro cdigo. De la mis-
ma forma que con XAML, necesitamos crear un nuevo elemento ComboBoxItem,
configurando sus propiedades y adicionndolo, en definitiva, al control ComboBox.
A continuacin, vemos cmo hacerlo:
, SMBOLO PIPE
En el cdigo de ejemplo, el smbolo | (Pipe) presenta una condicin OR (Uno u otro). Este sm-
bolo representa la posibilidad de elegir para las propiedades una u otra de las listadas. Como
existen propiedades con ms de dos valores seleccionables, stos se encontrarn delimitados
por tantos | como valores contenga.
120
04_Silverlight.qxp 9/30/09 1:31 PM Page 121
Controles y componentes
Contamos con una tercera forma de crear elementos para un control ComboBox. Es-
ta forma es la de enlazado de datos. El enlazado de datos nos facilita la tarea de
crear elementos por nuestra cuenta, al mismo tiempo que estos datos podran ser
obtenidos al ejecutar una consulta a una base de datos, servicio web o cualquier otro
que pudiera retornar una coleccin de elementos.
121
04_Silverlight.qxp 9/30/09 1:31 PM Page 122
4. XAML AL EXTREMO
Como en otros controles, el ComboBox posee una serie de eventos para poder cap-
turar determinadas acciones del usuario y disparar cdigo C#. Algunos de los prin-
cipales eventos los encontramos en la siguiente lista:
Para incluir el manejo de los eventos, podemos modificar el ComboBox como vemos
en el cdigo que aparece a continuacin
<ComboBox x:Name=ComboEnlazado
DropDownClosed=ComboEnlazado_DropDownClosed
DropDownOpened=ComboEnlazado_DropDownOpened
SelectionChanged=ComboEnlazado_SelectionChanged
/>
122
04_Silverlight.qxp 9/30/09 1:31 PM Page 123
Controles y componentes
En todo caso, el control ComboBox no se limita a las caractersticas que ya hemos visto.
Este control es extremadamente verstil, pudiendo adicionar elementos de diferentes
tipos a la lista desplegable. Esto quiere decir que no estamos limitados a mostrar tems
de slo texto, sino que tendremos la capacidad de agregar elementos complejos como
controles RadioButton, CheckBox, Image, entre otros. El siguiente cdigo XAML
demuestra cmo es posible agregar otro tipo de elementos al control ComboBox:
<ComboBox>
<ListBoxItem Content=Item 1/>
<CheckBox Content=Item 2/>
<ComboBoxItem Content=Item 3/>
<RadioButton Content=Item 4/>
<Image Source=http://www.redusers.com/wp-
content/themes/redusers/images/logo.jpg/>
</ComboBox>
Como podemos ver en el cdigo anterior, el control ComboBox poseer varios ele-
mentos, entre los que encontraremos un CheckBox, un RadioButton y un control
Image. En la Figura 29 podemos ver este ComboBox en pleno funcionamiento.
123
04_Silverlight.qxp 9/30/09 1:31 PM Page 124
4. XAML AL EXTREMO
Figura 29. El ComboBox tiene elementos complejos dentro de sus elementos seleccionables.
Al seleccionar el tem del ComboBox, ste pasar a visualizarse como el elemento se-
leccionado, presentando el mismo comportamiento que otros elementos, con la dife-
rencia de que, al ser un elemento compuesto, ste tambin poseer las caractersticas
de complejidad del control utilizado. En la Figura 30, el tem representado por un con-
trol CheckBox tambin incluye la funcionalidad de utilizar la casilla de verificacin.
Control ListBox
El control ListBox es homnimo del control ComboBox que ya vimos. La diferencia de
este control es su capacidad de mostrar la lista de elementos no en una lista desplega-
124
04_Silverlight.qxp 9/30/09 1:31 PM Page 125
Controles y componentes
ble, sino de manera constante, utilizando una barra de desplazamiento para movernos
a travs de la lista. Para crear un control ListBox, usamos la siguiente sintaxis:
<ListBox x:Name=[NombreDelControl]>
</ListBox>
El cdigo anterior muestra cinco elementos entre los cuales podemos encontrar un
grupo de controles RadioButton y un control Image. El atributo Height (alto) es usa-
do como el condicionante para, adems de configurar la altura del control, poder
indicar cuntos elementos debern ser mostrados en la lista inicial.
125
04_Silverlight.qxp 9/30/09 1:31 PM Page 126
4. XAML AL EXTREMO
Como hemos comentado, este control podra considerarse una extensin del control
ComboBox, por lo que la forma de manipularlo por cdigo, recolectar el elemento se-
leccionado, cargar nuevos elementos e interactuar con los eventos resulta similar. ni-
camente encontraremos una diferencia en la cantidad de eventos disponibles. Debido
a que este control no posee una lista desplegable, los dos eventos correspondientes al
accionar de la lista no estarn disponibles para su uso, por lo que slo podremos usar
el evento SelectionChanged, que se disparar cada vez que se accione un nuevo elemento.
Control TextBlock
El control TextBlock es, sin dudas, el ms simple de los controles, incluso ms senci-
llo que el control HyperlinkButton visto en pginas anteriores. El control TextBlock
cumple la funcin de mostrar un texto en nuestra aplicacin. Este control es til en
especial para mostrar textos informativos al usuario, as como para complementarlo
con otros controles o en la creacin de nuevos controles que requieran desplegar tex-
tos. La declaracin de este control se reduce a las siguientes lneas de cdigo:
126
04_Silverlight.qxp 9/30/09 1:31 PM Page 127
Controles y componentes
<TextBlock.Foreground>
<LinearGradientBrush EndPoint=0.5,1 StartPoint=0.5,0>
<GradientStop Color=#FFEEE659/>
<GradientStop Color=#FF1120A2 Offset=1/>
</LinearGradientBrush>
</TextBlock.Foreground>
</TextBlock>
Para este caso, agregamos los atributos FontFamily, FontSize y FontWeight. Estos atri-
butos son utilizados para configurar el tipo de fuente, su tamao y sus modificado-
res como, por ejemplo, Bold (negrita), Normal y otros. Tambin hemos agregado
ms elementos para modificar el color de la fuente, usando un color degradado
(hablaremos ms de este tema en los siguientes captulos).
Figura 32. TextBlock con un tipo de fuente diferente de la configurada por defecto.
Control TextBox
Al igual que el control anterior, el control TextBox es uno de los ms comunes en el de-
sarrollo de aplicaciones, y ya lo hemos usado en varios de los ejemplos a travs de los
captulos de este libro. Este control es el control bsico para introduccin de texto por
parte del usuario, permitindole escribir texto libremente para que sea procesado
por nuestra aplicacin. Este control posee una declaracin XAML muy simple:
127
04_Silverlight.qxp 9/30/09 1:31 PM Page 128
4. XAML AL EXTREMO
Figura 33. El TextBox superior utiliza la propiedad Wrap y el de abajo usa NoWrap.
Tambin podemos necesitar cajas de texto para introduccin de texto extenso. Estas
cajas poseen un tamao mayor que las de una sola lnea y muestran una barra de des-
plazamiento hacia el margen derecho de la caja, permitindole al usuario desplazarse
por el texto escrito. Para lograr esto, deberemos agrandar el tamao de la caja de texto
tanto como creamos necesario y configurar el atributo VerticalScrollBarVisibility con el
valor Visible. Esta accin mostrar la barra de desplazamiento de manera constante, sin
importar si el texto escrito sobrepasa la capacidad de la caja de texto.
128
04_Silverlight.qxp 9/30/09 1:31 PM Page 129
Controles y componentes
129
04_Silverlight.qxp 9/30/09 1:31 PM Page 130
4. XAML AL EXTREMO
Al igual que los dems controles en Silverlight, el control TextBox tambin posee
eventos que se dispararn bajo determinadas acciones del usuario. El ms destaca-
do es el evento TextChanged, que se disparar cada vez que el contenido del control
(su texto) cambie de estado. Podemos declarar el evento de la siguiente manera:
En este ejemplo, cada vez que el usuario modifique el texto, ste se escribir en la
consola de depuracin de Visual Studio 2008.
Control PasswordBox
PasswordBox es un control que extiende la funcionalidad del control TextBox con el
objetivo de brindarnos la posibilidad de manipular contraseas en nuestras aplica-
ciones. El control PasswordBox est diseado para representar todos los caracteres
introducidos por el usuario por medio de una mscara, ocultando lo que ste es-
criba y mostrando cada carcter introducido por medio de un punto de color negro.
130
04_Silverlight.qxp 9/30/09 1:31 PM Page 131
Controles y componentes
Este control es muy til en aquellas aplicaciones donde el usuario deba introducir
credenciales de validacin, ya que stas no deben ser mostradas a otros usuarios que
pudieran estar mirando su pantalla en el momento de realizar esta accin. A conti-
nuacin, podemos ver el cdigo XAML para declarar este control:
131
04_Silverlight.qxp 9/30/09 1:31 PM Page 132
4. XAML AL EXTREMO
El control PasswordBox tambin posee eventos comunes utilizados por todos los con-
troles, pero, al igual que el control TextBox, PasswordBox tiene un evento en particular
para capturar la modificacin del estado del texto escrito en l. El evento en cuestin
es PasswordChanged, y se comporta de igual forma que su homnimo TextChanged del
control TextBox. Declaramos el evento PasswordChanged de la siguiente forma:
Control DataGrid
En el captulo 3, hemos hecho uso del control DataGrid para mostrar informacin en
forma de filas y columnas. Tambin vimos algunos atributos que permiten al usua-
rio reordenar las columnas del control en tiempo de ejecucin, cambiar el tamao
de las columnas y especificar diferentes colores para las filas mostradas. En este
caso, iremos un poco ms lejos, y mostraremos otras caractersticas del control.
Primero, recordemos cmo declarar el control DataGrid en XAML.
<data:DataGrid>
</data:DataGrid>
<UserControl xmlns:data=clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data
132
04_Silverlight.qxp 9/30/09 1:31 PM Page 133
Controles y componentes
ste es el motivo por el cual usamos <data:DataGrid> para declarar el control en nues-
tro cdigo. Podemos ver que el atributo xmlns genera una referencia al tipo data,
indicndole desde dnde deber consumir estos componentes.
133
04_Silverlight.qxp 9/30/09 1:31 PM Page 134
4. XAML AL EXTREMO
En el cdigo que aparece en la pgina anterior, podemos ver algunos nuevos tags
usados para definir nuestras columnas. Veamos en detalle cada uno.
Podemos enlazar los datos desde una lista de entidades como la siguiente:
Los caracteres de escape son cdigos especiales para representar elementos que, tpicamente,
no se pueden generar en cadenas de texto. Algunos de los caracteres ms usados son: \n para
retornos de carro; \\ para agregar una barra invertida; \ para agregar una comilla doble; \ pa-
ra agregar una comilla simple.
134
04_Silverlight.qxp 9/30/09 1:31 PM Page 135
Controles y componentes
public Page()
{
135
04_Silverlight.qxp 9/30/09 1:31 PM Page 136
4. XAML AL EXTREMO
InitializeComponent();
LlenarGrilla();
}
this.MiDataGrid.ItemsSource = personas;
}
<data:DataGridTemplateColumn Header=Regalo>
<data:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsEnabled=False IsChecked={Binding EnviarRegalo}
></CheckBox>
</DataTemplate>
</data:DataGridTemplateColumn.CellTemplate>
</data:DataGridTemplateColumn>
Es importante recordar que, si estamos trabajando con plantillas de columnas, debemos confi-
gurar el atributo AutoGenerateColumns con el valor False para que no se generen las columnas
de forma automtica en el momento de enlazar los datos. Si olvidamos esto, las columnas se re-
petirn, y la informacin no ser consistente.
136
04_Silverlight.qxp 9/30/09 1:31 PM Page 137
Controles y componentes
As como es posible crear nuestras propias columnas para mostrar la informacin, tam-
bin podemos crear columnas con comportamiento para el momento de editarlas.
</data:DataGridTemplateColumn.CellTemplate>
<data:DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<basics:DatePicker SelectedDate={Binding FechaNacimiento,
Mode=TwoWay} />
</DataTemplate>
</data:DataGridTemplateColumn.CellEditingTemplate>
</data:DataGridTemplateColumn>
Mediante el cdigo anterior, es posible agregar una plantilla de columna para los
casos en el que el usuario edite el contenido de la celda. Tambin hay que notar
que esta columna <data:DataGridTemplateColumn.CellEditingTemplate> debe estar
dentro del tag <data:DataGridTemplateColumn> y dentro del conjunto de la co-
lumna creada para asociar los datos en modo de vista que usamos al principio
del ejemplo. En este caso, la columna de edicin es utilizada para mostrar un
control DatePicker y as poder manejar la fecha de nacimiento de una manera
ms prctica para el usuario, como se muestra en la Figura 39.
137
04_Silverlight.qxp 9/30/09 1:31 PM Page 138
4. XAML AL EXTREMO
this.MiDataGrid.FrozenColumnCount = 1;
138
04_Silverlight.qxp 9/30/09 1:31 PM Page 139
Controles y componentes
Control Calendar
El control Calendar nos permite manejar fechas de manera fcil. Por lo general,
el manejo de fechas puede ser una tarea compleja, especialmente cuando necesi-
tamos representar la misma fecha en diferentes idiomas. Para darnos una idea
mediante un ejemplo simple, el patrn DD/MM/YYYY (da, mes, ao), utiliza-
do casi siempre en pases de habla hispana, difiere del formato MM/DD/YYYY
(mes, da, ao), utilizado en pases de habla inglesa. Este cambio, que a simple
vista puede resultar trivial, a nivel de cdigo puede ocasionar severos dolores de
cabeza para el desarrollador, ya que implica convertir fechas de un formato a otro
sobre la base de las configuraciones del usuario.
Como podemos imaginar, este problema puede acrecentarse an ms en am-
bientes de aplicaciones orientadas a la Web, debido a que stas pueden ser acce-
didas desde todos los pases del globo, donde cada usuario utiliza un formato de
fechas diferente del nuestro. Imaginemos lo complejo que resultara tener que
analizar en forma manual cada entrada de un usuario para poder saber la fecha
exacta que quiso introducir. En el cdigo que aparece a continuacin vemos la
declaracin de un control Calendar en XAML:
<basics:Calendar>
</basics:Calendar>
139
04_Silverlight.qxp 9/30/09 1:31 PM Page 140
4. XAML AL EXTREMO
<UserControl xmlns:basics=clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls
DisplayMode
Esta propiedad representa la forma en que ser mostrado el calendario y sus fechas,
pudiendo optar por alguno de los siguientes valores:
Month (mes): el calendario muestra todos los das correspondientes al mes selec-
cionado, permitiendo desplazarse de mes en mes y seleccionar uno o ms das.
Year (ao): los elementos seleccionables del calendario sern los meses del ao ele-
gido, pero no se pueden seleccionar das.
Decade (dcada): muestra el calendario en formato de aos, desplegando un conjun-
to de aos sin meses ni das. Es posible seleccionar un ao o un rango de stos.
SelectionMode
El atributo SelectionMode (modo de seleccin) hace referencia a la forma en c-
mo el usuario podr seleccionar una fecha en el control Calendar. Este atributo
puede tomar los valores que se listan a continuacin:
140
04_Silverlight.qxp 9/30/09 1:31 PM Page 141
Controles y componentes
None: el usuario no podr seleccionar ninguna fecha del calendario. Esta opcin
es ideal para mostrar el calendario para solo lectura.
SingleDate: el usuario podr seleccionar una nica fecha del calendario.
SingleRange: con esta opcin, el usuario podr seleccionar un rango de fechas, pe-
ro no podr concatenarlas con otros rangos o fechas individuales.
MultiRange: esta seleccin de mltiples rangos de fechas permite al usuario selec-
cionar rangos de fechas en intervalos. El usuario puede usar la tecla CTRL y el bo-
tn del mouse para seleccionar ms de una fecha o un rango de stas.
Este control tambin nos permite definir rangos de fechas que no puedan ser
seleccionadas por el usuario. Esta accin suele ser usada en aplicaciones que ne-
cesiten mostrar das no laborales, fechas disponibles para la seleccin o fechas ya
141
04_Silverlight.qxp 9/30/09 1:31 PM Page 142
4. XAML AL EXTREMO
seleccionadas que no deban ser utilizadas por el usuario. Para lograr esto, debe-
remos usar la propiedad BlackoutDates y asignar el rango de fechas por bloquear
desde nuestro cdigo C#. En este caso, se mostrar el rango de fechas desde el
6 de junio de 2009 hasta el 15 de junio de 2009 como fechas no seleccionables,
Es posible agregar tantos rangos de fechas bloqueadas como necesitemos. Para esto ser
necesario agregar tantos atributos BlackoutDates como rangos bloqueados necesitemos.
142
04_Silverlight.qxp 9/30/09 1:31 PM Page 143
Controles y componentes
Existe en la Web una infinidad de recursos sobre Silverlight, tanto cdigo de ejemplo como no-
vedades sobre actualizaciones. Uno de los sitios que no podemos dejar de visitar es el de la
biblioteca de clases Microsoft, que podemos encontrar en http://msdn.microsoft.com.
143
04_Silverlight.qxp 9/30/09 1:31 PM Page 144
4. XAML AL EXTREMO
this.MiCalendario.SelectedDate = DateTime.Now.AddDays(10);
this.MiCalendario.SelectedDates.Add(DateTime.Now.AddDays(11));
this.MiCalendario.SelectedDates.Add(DateTime.Now.AddDays(12));
Cuando creamos plantillas para las columnas y, adems, incluimos plantillas de edicin de co-
lumnas, es importante asegurarnos de agregar el atributo Mode con el valor TwoWay (dos vas).
Si no lo hacemos, podramos perder informacin, ya que la fuente de datos no se actualizara con
la accin de edicin del usuario.
144
04_Silverlight.qxp 9/30/09 1:31 PM Page 145
Controles y componentes
Estas mismas propiedades pueden ser usadas para recolectar la fecha seleccionada.
Teniendo en cuenta que, para asignar el valor hemos usado un tipo DateTime, al
recuperarlo obtendremos tambin un tipo DateTime. La ventaja de esto es que no
deberemos preocuparnos por el formato de fecha usado por el usuario.
145
04_Silverlight.qxp 9/30/09 1:31 PM Page 146
4. XAML AL EXTREMO
El control Calendar, al igual que los dems controles, posee eventos que nos avisarn
de los cambios realizados por el usuario. Los tres eventos principales listados en el
cdigo anterior son DisplayDateChanged, DisplayDatesChanged y DisplayModeChanged.
Los dos primeros estn relacionados con la seleccin de fechas por parte del usuario:
mientras que DisplayDateChanged se disparar cada vez que el usuario seleccione una
nueva fecha, DisplayDatesChanged se disparar cuando el usuario modifique el rango
de fechas seleccionadas. Por otro lado, DisplayModeChanged se disparar cuando el
modo de presentacin del calendario (Month, Year, Decade) sea alterado.
146
04_Silverlight.qxp 9/30/09 1:31 PM Page 147
Controles y componentes
<basics:Calendar
DisplayDateChanged=Calendar_DisplayDateChanged
DisplayModeChanged=Calendar_DisplayModeChanged
SelectedDatesChanged=Calendar_SelectedDatesChanged
DisplayMode=Decade/>
Control DatePicker
El control DatePicker es una extensin del control Calendar que vimos antes. Este con-
trol extiende la funcionalidad del calendario agregando una caja de texto para que el
usuario pueda escribir en ella una fecha sin tener que navegar en el calendario para
poder seleccionarla. Adems, este control suele ocupar menos espacio al desplegar el
calendario cuando el icono de calendario a la derecha de la caja de texto es seleccio-
nado, ocultndolo una vez que la fecha fue seleccionada. La declaracin es:
<basics:DatePicker>
</basics:DatePicker>
Long: fecha en formato largo. La caja de texto mostrar la fecha usando el nombre
del da y el nombre del mes seleccionado, generando una fecha larga.
Short: fecha en formato corto. La caja de texto utilizar el formato corto nu-
mrico (dd/mm/yyyy) para mostrar la fecha seleccionada.
, MANEJO DE FECHAS
Los formatos en los que se pueden expresar las fechas varan de acuerdo al pas del usuario.
Por lo tanto, deberemos tener sumo cuidado al momento de manipular estos valores en aplica-
ciones que puedan ser consumidas desde diferentes ubicaciones en el mundo. Ms informacin
en http://msdn.microsoft.com/es-es/.
147
04_Silverlight.qxp 9/30/09 1:31 PM Page 148
4. XAML AL EXTREMO
Control ProgressBar
El control ProgressBar (barra de progreso) representa, tpicamente, una lnea que pue-
de mostrar el progreso evolutivo de una cosa. Es comn ver este tipo de controles en
aplicaciones donde se cargan elementos de manera dinmica, mostrando el progreso de
esta carga mediante una barra de progreso. La declaracin XAML es:
<ProgressBar>
</ProgressBar>
Minimum: este atributo representa el valor numrico mnimo que puede tomar la
barra de progreso. Casi siempre, el valor es equivalente a 0 (cero).
Maximum: el valor mximo permitido que obtendr la barra de progreso. Podemos
colocar un valor tan elevado como fracciones internas queramos tener. Esto quiere
decir que, si acumulamos valores para la barra de progreso avance de 10 en 10, y
nuestro mximo es de 100, slo veremos 10 intervalos en la barra de progresos. Si
usamos un valor mayor o valores menores acumulativos, la barra de progresos se des-
plazar con ms suavidad por tener un rango mayor de intervalos.
Value: este atributo contiene el valor de la barra de progreso. Si asignamos un
valor inicial diferente del valor mnimo establecido, la barra de progresos se mos-
trar con informacin de progreso inicializada.
148
04_Silverlight.qxp 9/30/09 1:31 PM Page 149
Controles y componentes
La propiedad Value es la que deberemos usar en nuestro cdigo para poder asig-
nar, en tiempo de ejecucin, valores al control ProgressBar para que ste mues-
tre el estado y el progreso de la accin realizada. Para entender este concepto,
podemos simular un proceso de carga mediante la utilizacin de un cronmetro
o Timer, y hacer que, por cada intervalo ejecutado por este cronmetro, el con-
trol ProgressBar avance su barra de progreso.
149
04_Silverlight.qxp 9/30/09 1:31 PM Page 150
4. XAML AL EXTREMO
this.MiProgressBar.Value += 1;
_temporizador.Begin();
}
}
private void IniciarProgressBar()
{
this.MiProgressBar.Value = 0;
_temporizador.Begin();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
IniciarProgressBar();
}
150
04_Silverlight.qxp 9/30/09 1:31 PM Page 151
Controles y componentes
Tambin es posible utilizar nuestro propio patrn visual para mostrar como barra
de progreso. Como vemos en la Figura 52 que aparece debajo, utilizamos una ima-
gen como elemento de progreso y no un elemento de color plano. Si agregamos
un objeto del tipo <ImageBrush> dentro del tag <ProgressBar.Foreground>, cam-
biamos el color slido de la barra de progreso por la imagen seleccionada.
151
04_Silverlight.qxp 9/30/09 1:31 PM Page 152
4. XAML AL EXTREMO
Control Slider
Slider es un control conocido por los desarrolladores de aplicaciones de escritorio. Pue-
de ser considerado una especie de potencimetro, y al desplazar el medidor, el control
informar el valor aplicado por el usuario. Podemos declararlo de la siguiente forma:
<Slider>
</Slider>
Algunos atributos del control Slider son similares al del control ProgressBar, pero
agrega otros especficos, que vemos a continuacin:
152
04_Silverlight.qxp 9/30/09 1:31 PM Page 153
Controles y componentes
En nuestro cdigo C#, tomaremos este valor para mostrarlo en la aplicacin. Como
resultado, cada vez que el usuario desplace la barra del control Slider, el control
TextBlock tomar este valor y lo mostrar.
RESUMEN
En este captulo hemos visto los controles nativos de Silverlight y cmo implementarlos por
medio de cdigo XAML y desde C#. Si bien hemos podido interactuar con las principales
propiedades de estos controles, an queda mucho por delante ya que es posible mezclarlos y
combinarlos de diferentes formas para obtener mejores interfaces visuales. Este captulo es
una gua de referencia sobre los controles Silverlight, y, en los captulos siguientes, utiliza-
remos lo que hemos visto aqu.
153
04_Silverlight.qxp 9/30/09 1:31 PM Page 154
ACTIVIDADES
1 XAML puede ser interpretado por siste- 1 Cree dos grupos de controles RadioButton.
mas no Microsoft? Intente que cada grupo trabaje de forma
independiente haciendo que la eleccin de
2 Cul es el problema principal entre las in- un control en un grupo no afecte el ele-
terfaces para distintas plataformas? mento seleccionado en el segundo grupo.
3 Cmo ayuda el cdigo XAML en la posibi- 2 Los controles pueden ser creados desde
lidad de transportar las interfaces entre cdigo XAML. Intente crear un conjunto de
distintas plataformas? controles, pero desde cdigo C#.
7 Es posible que el usuario desplace las co- 5 Transforme un control HyperlinkButton pa-
lumnas y filas de un control Grid sin nece- ra que ste sea una imagen y no un texto.
sidad de generar cdigo?
154
05_Silverlight.qxp 9/30/09 1:32 PM Page 155
Silverlight Captulo 5
Luz, cmara,
accin
La forma de presentar la informacin
MOVER OBJETOS
En los captulos anteriores, hemos usado Silverlight para desplegar informacin des-
de fuentes de datos, permitiendo al usuario interactuar con stos. Podramos decir
que, de alguna forma, hemos creado interfaces de la manera tradicional, colocando
controles en un espacio bidimensional, tratando de llenar el espacio especificado pa-
ra la interfaz de la mejor forma posible. Y cuando hacemos referencia a la mejor for-
ma posible, en realidad queremos decir que, muchas veces, las aplicaciones tratan de
ocupar por completo cualquier espacio disponible de la superficie de la interfaz, co-
locando botones o cualquier otro tipo de controles all donde exista un espacio en
blanco. Esto se debe al hecho de que, con el avance de la tecnologa y de la infor-
macin en general, cada vez ms las aplicaciones de software necesitan mostrar ma-
yor cantidad de datos en pantalla, ya que el usuario requiere ver ms informacin al
mismo tiempo sin tener que navegar entre diferentes ventanas o pulsar varios boto-
nes para conseguir lo que le interesa. Por otro lado, tener que moverse de un lado al
otro, y abrir y cerrar ventanas, muchas veces trae como consecuencia que datos im-
portantes queden ocultos por las nuevas ventanas, y se llegue al punto en el que el
usuario olvide por completo el porqu de la bsqueda inicial. Este tipo de desarrollo
se propag, en especial, por la falta de soporte de los sistemas operativos y por la com-
plejidad de desarrollo de los variados lenguajes de programacin usados para crear las
diferentes aplicaciones. En muchos casos, las interfaces de las aplicaciones, por estas
restricciones, llegan a presentarse como la que podemos ver en la siguiente figura.
156
05_Silverlight.qxp 9/30/09 1:32 PM Page 157
Mover objetos
Una interfaz de usuario demasiado cargada ocasionar rechazo por parte de ste. Es necesario,
siempre que podamos, dejar las interfaces lo ms simples y claras posibles, incluso moviendo
los elementos en la pantalla durante la ejecucin y abriendo la menor cantidad posible de ven-
tanas o elementos que obstruyan la visin de datos importantes.
157
05_Silverlight.qxp 9/30/09 1:32 PM Page 158
Transformaciones
Las transformaciones son uno de los modificadores de objetos disponibles en Sil-
verlight. Con ellas, es posible cambiar la apariencia y el comportamiento de los con-
troles y componentes de la interfaz. Es posible rotarlos, escalarlos, distorsionarlos,
modificar su posicin relativa a un punto, as como invertir su posicin vertical u ho-
rizontal. Podemos ver, a continuacin, la lista de transformaciones disponibles:
RRR TRANSFORMACIONES
Al aplicar una transformacin a cualquier objeto, ste se redibujar en forma instantnea. Esto
es por dems til para generar animaciones en tiempo de ejecucin en nuestra aplicacin, ya que
no necesitaremos de clculos o de imgenes pregeneradas para conseguir el efecto deseado.
158
05_Silverlight.qxp 9/30/09 1:32 PM Page 159
Mover objetos
Transformacin de traslacin
La transformacin de traslacin es usada para desplazar o colocar un objeto en una
posicin en X y en Y dentro del lienzo de una aplicacin. En la Figura 4, el rectngulo
se encuentra por encima de la lnea que divide las dos columnas de la grilla.
Los controles de agrupacin, como vimos en captulos anteriores, pueden contener otros con-
troles y manejarlos como un conjunto agrupado. Si necesitamos mover ms de un control al
mismo tiempo, es posible aplicar una transformacin de traslacin al contenedor de estos
controles en lugar de hacerlo uno por uno.
159
05_Silverlight.qxp 9/30/09 1:32 PM Page 160
Si bien hemos definido dos columnas y una fila en la grilla, y el rectngulo est po-
sicionado en la primera columna y la primera fila de acuerdo con los atributos
160
05_Silverlight.qxp 9/30/09 1:32 PM Page 161
Mover objetos
Transformacin de rotacin
Con esta transformacin, podremos rotar cualquier objeto. Aplicando la misma
transformacin al rectngulo anterior, obtenemos el resultado que observamos en
la Figura 5. Para conseguir esta transformacin debemos aplicar el siguiente cdigo.
<RotateTransform> posee dos atributos adicionales que resultan tiles para espe-
cificar el punto de rotacin. En el ejemplo anterior, el punto de rotacin haba
sido especificado mediante el atributo RenderTransformOrigin, separando con una
coma el punto de rotacin en X y en Y. En este ejemplo, el punto de rotacin se
encuentra posicionado en el centro del objeto especificando 0.5 (50%) para X y
161
05_Silverlight.qxp 9/30/09 1:32 PM Page 162
0.5 (50%) para Y. Como resultado, teniendo una copia del mismo rectngulo,
pero con una rotacin de 90 grados, ste gira sobre el punto central del elemento.
Si bien podemos utilizar RenderTransformOrigin, tambin es vlido utilizar los
atributos CenterX y CenterY dentro del tag <RotateTransform> para realizar el mis-
mo trabajo que el del atributo anterior. En la Figura 6, vemos los dos casos. En
ellos, a un grupo de elementos, no se le especifica un punto de rotacin, lo que
causa que este punto sea el extremo superior izquierdo.
162
05_Silverlight.qxp 9/30/09 1:32 PM Page 163
Mover objetos
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle Margin=0,86,26,0 Fill=#FF4366DE Stroke=#FF000000
Width=158 HorizontalAlignment=Right VerticalAlignment=Top
Height=29>
<Rectangle.RenderTransform>
<TransformGroup>
<RotateTransform/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
<Rectangle Margin=0,86,26,0 Fill=#FF4366DE Stroke=#FF000000
Width=158 HorizontalAlignment=Right Height=29
VerticalAlignment=Top>
<Rectangle.RenderTransform>
<TransformGroup>
<RotateTransform Angle=30/>
</TransformGroup>
</Rectangle.RenderTransform>
</Rectangle>
...
Un punto que debemos tener en cuenta sobre cul de los dos atributos necesita-
mos usar radica en la forma de calcular la posicin del punto de rotacin. Por su
parte, RenderTransformOrigin utiliza un valor porcentual, siendo 1 equivalente a
100%. Si el valor de RenderTransformOrigin es equivalente a 1,1, ste ser igual
a la esquina inferior derecha, mientras que 0,0 representar la esquina superior
izquierda. Este mtodo para especificar el punto de rotacin puede resultar, en
algunos casos, ms fcil de calcular, en especial para deducir el centro de rota-
cin, ya que ste es representado por el valor 0.5,0.5. Sin embargo, podra ser
complejo de calcular para puntos intermedios.
Por otro lado, para el caso de CenterX y CenterY, se utilizan valores numricos
equivalentes al tamao del objeto por rotar. As, si el objeto ocupa 100 pixeles
de ancho y 50 pixeles de alto, el valor para CenterX deber ser de 50, mientras el
valor para CenterY deber ser de 25. Como ya dijimos, los controles y compo-
nentes tambin pueden ser afectados por estas transformaciones. Ellos seguirn
prestando la misma funcionalidad, pero, en lo visual, se desplegarn basados en
su transformacin. En la Figura 7, vemos cmo una serie de controles aplican la
transformacin de rotacin sin perder funcionalidad.
163
05_Silverlight.qxp 9/30/09 1:32 PM Page 164
Si bien los valores para el punto de rotacin que hemos usado hasta el momento se
aplican a la parte interna del objeto rotado, es posible utilizar valores que sobrepa-
164
05_Silverlight.qxp 9/30/09 1:32 PM Page 165
Mover objetos
sen los lmites del objeto por rotar. De esta manera, conseguiremos que el eje de ro-
tacin quede fuera del objeto. Esto har que el punto de rotacin marque la posi-
bilidad de rotacin por sobre una circunferencia y permitir que el elemento gire
alrededor de este punto como si se tratase de una rbita en un punto especfico.
Transformacin escalar
La transformacin escalar es til para modificar el tamao de los objetos, tanto
en largo como en alto o en una escala para X como para Y, si trasladamos las di-
mensiones a un eje XY. En la figura que vemos a continuacin, podemos apre-
ciar dos rectngulos con sus respectivas modificaciones.
Los atributos utilizados para modificar la escala de los objetos son ScaleX y ScaleY,
ambos usados dentro del tag <ScaleTransform>, que hace referencia a este tipo de trans-
formacin. Podemos ver el cdigo utilizado para generar la Figura 8 a continuacin.
165
05_Silverlight.qxp 9/30/09 1:32 PM Page 166
166
05_Silverlight.qxp 9/30/09 1:32 PM Page 167
Mover objetos
Transformacin de distorsin
Esta ltima transformacin modifica la apariencia del objeto aplicando ngulos de
torsin. Pensemos en un objeto de forma cuadrada o rectangular. Cada esquina de
este objeto es representada por un ngulo de 90 grados. Esta transformacin tiene
el objetivo de modificar estos ngulos rectos sobre la base de un valor numrico ex-
presado, tambin, en grados. En la siguiente figura, vemos cmo es distorsionada la
apariencia de un objeto cuadrado.
En el cdigo que aparece a continuacin, podemos ver que los atributos AngleX
y AngleY son configurados con los valores de -10 grados cada uno. Estos dos atri-
butos, junto con RenderTransformOrigin, son los que le otorgan el aspecto final
al objeto una vez distorsionado.
Si modificamos el valor RenderTransformOrigin para que se encuentre fuera del
centro del objeto, conseguiremos distorsiones no simtricas, que pueden ser ti-
les, basadas en la perspectiva que queramos lograr.
167
05_Silverlight.qxp 9/30/09 1:32 PM Page 168
<Grid x:Name=LayoutRoot>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=0.512*/>
<ColumnDefinition Width=0.488*/>
</Grid.ColumnDefinitions>
<Grid.Background>
168
05_Silverlight.qxp 9/30/09 1:32 PM Page 169
Mover objetos
169
05_Silverlight.qxp 9/30/09 1:32 PM Page 170
Luego, modificamos el cdigo encargado de realizar las bsquedas sobre la base del tex-
to introducido por el usuario para desplegar la cantidad de registros encontrados.
this.MiGrilla.ItemsSource = q;
this.registros.Text = Registros + q.Count<Producto>().ToString();
}
De esta manera, probamos que las transformaciones pueden ser no slo aplicadas a
formas bsicas, sino a cualquier elemento creado por cdigo XAML.
Animaciones
Como hemos notado con las transformaciones, stas no generan nuevos ele-
mentos del objeto modificado, sino que actan sobre l en tiempo de ejecucin
de la aplicacin Silverlight. Esto ahorra, por un lado, los recursos transmitidos
hacia el cliente que visualiza nuestra aplicacin, y por otro, nos da la posibilidad
de modificar estas transformaciones en tiempo de ejecucin, no atndonos a un
guin establecido con anterioridad. Basadas en este modelo, las animaciones en
170
05_Silverlight.qxp 9/30/09 1:32 PM Page 171
Mover objetos
DoubleAnimation
Como dijimos, este modelo de animacin es til cuando queremos modificar los
valores numricos de las propiedades y atributos de cualquier objeto. Para declarar
una animacin de este tipo, podemos usar el siguiente cdigo:
Los atributos From (desde) y To (hasta) determinarn los rangos entre los cuales el
atributo por modificar se ir alternando. En el caso anterior, el valor en cuestin
ir desde 128 a 200; estos valores se distribuirn de acuerdo con el tiempo especi-
ficado por el atributo Duration (duracin). Este ltimo atributo es representado por
los valores correspondientes a horas, minutos y segundos (hh:mm:ss). Para el ejem-
plo, la animacin tendr una duracin de 10 segundos. En la Figura 12, vemos
cmo, al aplicar esta animacin sobre la propiedad Width de un rectngulo, ste
modifica su tamao segn dicha animacin.
171
05_Silverlight.qxp 9/30/09 1:32 PM Page 172
Para lograr esto, lo primero que deberemos hacer es crear nuestro rectngulo.
<UserControl.Resources>
<Storyboard x:Name=Animacion1>
<DoubleAnimation From=128 To=200 Duration=0:0:01
Storyboard.TargetProperty=Width
Storyboard.TargetName=Rectangulo></DoubleAnimation>
</Storyboard>
</UserControl.Resources>
172
05_Silverlight.qxp 9/30/09 1:32 PM Page 173
Mover objetos
El siguiente tag es el <Storyboard>. Este tag agrupar en un conjunto todas las ani-
maciones que se van a aplicar a un mismo objeto o, si lo preferimos, animaciones
para diferentes objetos que podremos ejecutar al mismo tiempo como un conjun-
to. Es importante la presencia de un nombre para el tag <Storyboard> por medio del
atributo x:Name, ya que de esta forma podremos iniciar la ejecucin del conjunto
de animaciones invocando su nombre. Los atributos del tag <DoubleAnimation>,
Storyboard. TargetProperty y Storyboard.TargetName hacen referencia a la propiedad
que esa animacin modificar y al nombre del objeto que contiene la propiedad, res-
pectivamente. Para este caso, Storyboard.TargetProperty hace referencia a la propiedad
Width del objeto definido por Storyboard.TargetName, que en este caso es Rectangulo.
Para activar la animacin, es necesario especificar el momento en el cual sta se ini-
ciar. Esto lo logramos desde nuestro cdigo C#, de la siguiente manera, donde
animacin es el nombre previamente configurado en el tag <Storyboard>:
this.Animacion1.Begin();
ColorAnimation
ColorAnimation es necesaria para animaciones que modifiquen el color de los obje-
tos. Posee iguales atributos que los presentados en la animacin del tipo DoubleAnimation
y, para usarla, deberemos declararla como sigue:
<ColorAnimation></ColorAnimation>
173
05_Silverlight.qxp 9/30/09 1:32 PM Page 174
PointAnimation
PointAnimation es el ltimo de los modelos de animacin propuestos por Silverlight.
Puede ser usado para modificar puntos de coordenadas XY. Para declarar esta ani-
macin, debemos hacerlo de la siguiente manera:
<PointAnimation></PointAnimation>
174
05_Silverlight.qxp 9/30/09 1:32 PM Page 175
Mover objetos
<Storyboard x:Name=Animacion2>
<PointAnimation From=0,200 To=300,200 Duration=0:0:2
Storyboard.TargetName=GeometriaCircular
Storyboard.TargetProperty=Center> </PointAnimation>
</Storyboard>
Animaciones y transformaciones
Con un poco de imaginacin, veremos que la combinacin de animaciones con los
atributos de los controles nos puede dar suficiente libertad como para hacer casi todo
lo que necesitemos. Podramos por ejemplo, conjugar animaciones con las transfor-
maciones vistas al principio de este captulo para conseguir no slo modificar tamaos,
colores o posiciones de los objetos, sino tambin poder cambiar de aspecto, rotarlo,
175
05_Silverlight.qxp 9/30/09 1:33 PM Page 176
<Storyboard x:Name=Animacion>
<DoubleAnimation From=0 To=90
176
05_Silverlight.qxp 9/30/09 1:33 PM Page 177
Mover objetos
Storyboard.TargetName=anguloRectangulo
Storyboard.TargetProperty=Angle></DoubleAnimation>
</Storyboard>
_` ANIMAR CURVAS
Debido a que podemos definir lneas sinusoidales, las cuales cuentan con puntos XY de inicio y
puntos XY de finalizacin adems de un radio de curva, es posible usar PointAnimation para ani-
mar esta curva en tiempo de ejecucin para lograr efectos de ondas.
177
05_Silverlight.qxp 9/30/09 1:33 PM Page 178
Estilos y plantillas
En la mayora de los casos, usamos los controles provistos por Silverlight tal como son,
sin modificar su apariencia visual predefinida. Esto puede ser til en muchos casos, pe-
ro existirn muchas ocasiones en las que deberemos adaptar estos elementos a nuestros
diseos, y modificar las propiedades visuales de los componentes. Para lograr esto, so-
lemos cambiar la apariencia visual control por control, algo que consumir tiempo y
ser costoso, adems de generar cdigo XAML innecesario, agrandando el tamao de
nuestra aplicacin y hacindola mucho ms complicada de modificar y mantener. Ima-
ginemos que nuestra aplicacin cuenta con veinte botones y que, despus de haber mo-
dificado y terminado nuestro trabajo, nos encontramos con un nuevo requerimiento
que implica tener que volver a cambiar el aspecto de estos botones. Hacer este cambio
nos resultar un esfuerzo extremadamente costoso. Para solucionar el problema, debe-
mos hacer uso de estilos. Estos estilos trabajan de manera similar a las hojas de estilo
(CSS, Cascade Style Sheets) de HTML, donde podremos definir un comportamiento
visual general para los controles y aplicarlos a todos los controles que necesitemos. As,
al modificar un estilo, es posible afectar a todos los controles que consuman de ste.
Las plantillas o moldes, por otra parte, son utilizados para redefinir el comportamiento,
como la apariencia visual sobre la base de un control inicial, pero la redefinicin de la
apariencia visual va mucho ms all que la conseguida con estilos. Mientras que con
estilos podemos modificar las caractersticas tales como color, ancho, alto, o tipo
de fuente usada en el control, con las plantillas podremos hacer que, por ejemplo,
un botn no tenga la apariencia de un botn como tal, sino que, por el contrario,
se transforme en un crculo, en una imagen o en cualquier otro elemento que es-
t acorde a nuestras necesidades visuales.
Estilos
Luego de lo dicho anteriormente, veremos cmo modificar la apariencia visual de
los controles con la creacin y aplicacin de estilos a los controles ya existentes. Pa-
ra poder declarar un estilo, debemos seguir el siguiente patrn:
<UserControl.Resources>
<Style x:Key=Estilo1 TargetType=TextBox>
...
</Style>
</UserControl.Resources>
Podemos ver que el estilo es declarado dentro de los recursos del tag <UserControl>
de la misma forma que hicimos con las animaciones y el tag <Storyboard>. Si bien
sta es una opcin, tambin podramos declarar este estilo en los recursos globales
de toda la aplicacin, colocndolo dentro del archivo App.xaml.
178
05_Silverlight.qxp 9/30/09 1:33 PM Page 179
Mover objetos
<Application.Resources>
<Style x:Key=Estilo1 TargetType=TextBox>
...
</Style>
</Application.Resources>
x:Key: este atributo es necesario para poder identificar el estilo creado. Consumi-
remos el estilo mediante este nombre.
TargetType: tipo de control que podr usar este estilo. Con este atributo, restringimos
el uso del estilo a un tipo de control. Es similar a la capacidad de ASP.net de gene-
rar estilos visuales para los controles, pudiendo crear estilos para tipos especficos.
CDIGO DE EJEMPLO
En la Web, podemos encontrar cientos de sitios con cdigo de ejemplo para Silverlight 2. De cual-
quier manera, uno de los destacados es el sitio oficial de Silverlight, hasta el que podemos na-
vegar para descargar excelentes ejemplos. La direccin es http://silverlight.net.
179
05_Silverlight.qxp 9/30/09 1:33 PM Page 180
Los estilos se aplican a cada una de las propiedades del objeto que queremos confi-
gurar. En el caso de la Figura 17, el estilo utilizado es el siguiente:
<Setter Property=Background>
<Setter.Value>
<LinearGradientBrush EndPoint=0.5,1 StartPoint=0.5,0>
<GradientStop Color=#FF88CAF0/>
<GradientStop Color=#FFFFFFFF Offset=1/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property=BorderBrush>
<Setter.Value>
<LinearGradientBrush EndPoint=0.5,1 StartPoint=0.5,0>
<GradientStop Color=#FFA3AEB9/>
<GradientStop Color=#FF9DBACE Offset=0.567/>
<GradientStop Color=#FF000000 Offset=1/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property=Foreground Value=#FF342449/>
<Setter Property=BorderThickness Value=2,2,2,2/>
<Setter Property=MinHeight Value=25/>
<Setter Property=Text Value=/>
</Style>
Necesitamos colocar, por cada atributo por modificar, un tag <Setter>, el mismo que
especifica el nombre de la propiedad (Property) que se modificar y su valor (Value).
Es posible tambin especificar valores para tipos complejos mediante el uso de <Setter.
Value>, colocando dentro de ste la descripcin del tipo complejo. Por ltimo, debe-
remos aplicar el estilo al control que lo consumir de la siguiente manera:
Si colocamos los estilos dentro de la declaracin del tag <UserControl> como den-
tro del tag <Application>, es posible reutilizarlos de forma global, aunque tambin
180
05_Silverlight.qxp 9/30/09 1:33 PM Page 181
Mover objetos
<StackPanel Margin=171,12,24,71>
<StackPanel.Resources>
<Style x:Key=EstiloContenido TargetType=Button>
<Setter Property=BorderThickness Value=2,2,2,2/>
<Setter Property=Background>
...
181
05_Silverlight.qxp 9/30/09 1:33 PM Page 182
Plantillas
Si el estilo nos permiti modificar los valores, atributos y propiedades visuales
del control, las plantillas nos permitirn crear controles basndonos en otros y
alterar el aspecto de stos. La ventaja significativa de las plantillas radica en que,
utilizando como raz un control existente y pudiendo reusar sus eventos, podre-
mos crear uno nuevo. Pensemos en la capacidad de un botn de disparar un even-
to cuando el usuario lo presiona con el mouse. Esta capacidad no est presente
en todos los controles, por lo que podramos reutilizarla creando nuestro propio
botn con un aspecto diferente del estndar. De esta forma, partiendo de un con-
trol inicial, construimos uno completamente nuevo.
Figura 19. Un nuevo botn construido sobre la base del control estndar.
RRR SIMILITUDES
182
05_Silverlight.qxp 9/30/09 1:33 PM Page 183
Mover objetos
183
05_Silverlight.qxp 9/30/09 1:33 PM Page 184
<Button.Template>
<ControlTemplate TargetType=Button>
<Grid Width={TemplateBinding Width} Height={TemplateBinding
Height}>
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name=EstadosComunes>
<vsm:VisualState x:Name=Normal/>
<vsm:VisualState x:Name=MouseOver>
<Storyboard>
<DoubleAnimation From=11 To=16
Duration=0:0:0.2
Storyboard.TargetName=textInterno
Storyboard.TargetProperty=FontSize>
</DoubleAnimation>
</Storyboard>
</vsm:VisualState>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Border Background=#FFB0ECE8 BorderBrush=#FF000000
BorderThickness=2,2,2,2 CornerRadius=5,0,5,0
Width={TemplateBinding Width}>
<TextBlock x:Name=textInterno Text={TemplateBinding
Content} TextWrapping=NoWrap Margin=3,3,3,3
HorizontalAlignment=Center
VerticalAlignment=Center
FontSize=11/>
</Border>
</Grid>
</ControlTemplate>
</Button.Template>
</Button>
184
05_Silverlight.qxp 9/30/09 1:33 PM Page 185
Mover objetos
De esta forma, las animaciones contenidas dentro del tag <vsm:VisualState x:Name=
MouseOver> se ejecutarn cuando el usuario posicione el mouse sobre el botn. La
animacin, en este caso, agrandar el tamao de la fuente del texto interno del botn.
Con estas caractersticas no slo podemos modificar el control para que tenga el as-
pecto que nosotros queramos, sino que, adems, es posible manipular los estados por
los cuales pasar nuestro control, pudiendo modificar su presentacin y comporta-
miento acorde a cmo el usuario interacte con l.
RESUMEN
En este captulo aprendimos a manipular los distintos elementos de Silverlight de forma que
podamos quitarle rigidez a las aplicaciones que construyamos. Animaciones, transformacio-
nes y estilos para los controles, as como algunas tcnicas para presentar mejor el contenido
y hacer ms atractivas las interfaces con las que el usuario debe trabajar. En el prximo ca-
ptulo, nos introduciremos otro poco en caractersticas visuales como las DeepZoom, y nos
acercaremos ms an a los cdigos C# y JavaScript.
185
05_Silverlight.qxp 9/30/09 1:33 PM Page 186
ACTIVIDADES
9 Qu es un estilo en Silverlight 2?
186
06_Silverlight.qxp 9/30/09 1:33 PM Page 187
Silverlight Captulo 6
Cerrar
el crculo
Este captulo est dedicado a tratar tres
6. CERRAR EL CRCULO
MEDIAELEMENT
En el captulo 2, realizamos un proyecto Silverlight que implementaba el control
MediaElement para visualizar un video. Pero las caractersticas de este control pueden
ir mucho ms lejos y, con esto, todo lo relacionado al manejo de video dentro de Sil-
verlight. Este control no tiene como nico objetivo visualizar videos, ya que con l
podremos tambin ejecutar sonidos o hacer lo que se conoce como streaming (re-
produccin de videos bajo demanda). Veamos, entonces, cmo extender las capaci-
dades de este control maximizando las potencialidades que presenta.
Ejecutar sonidos
Antes de utilizar el control MediaElement para ejecutar sonidos, debemos cono-
cer los formatos soportados. Si bien el control tiene pleno soporte para los for-
matos creados por Microsoft, como el WMA (Windows Media Audio), tambin
es posible consumir un formato ms comn como el MP3. A continuacin, po-
demos ver todos los formatos soportados.
RRR RUTAS
Para acceder a un archivo, no deberemos usar rutas que incluyan identificadores tales como
C:\Directorio\Archivo, sino que accederemos a los archivos como si se tratara de un recurso
web, utilizando slo rutas relativas al punto de origen de la aplicacin Silverlight.
188
06_Silverlight.qxp 9/30/09 1:33 PM Page 189
MediaElement
Debemos tener sumo cuidado al momento de colocar la ruta del recurso de soni-
do por reproducir, ya que se requiere de una ruta relativa a la posicin donde se
encuentra el resultado de nuestra aplicacin Silverlight. Esto quiere decir que, si el
archivo de sonido se encuentra a la misma altura en el rbol de directorios que
nuestra aplicacin, slo necesitaremos colocar el nombre del elemento que se re-
producir. Pero, si ste est en alguna ruta ms profunda, deberemos colocar la ruta
desde el punto inicial de nuestra aplicacin en adelante. En el cdigo anterior,
vemos que el sonido por reproducir se encuentra dentro de la carpeta Musica a par-
tir de la posicin del archivo compilado, como se muestra en la siguiente figura.
Tanto sea de video como de sonido el archivo que estamos agregando a nuestro proyecto Silverlight,
debemos configurar ste para que sea copiado junto con el resultado de la aplicacin cada vez
que la compilemos. Podemos conseguir esta accin seleccionando el archivo y modificando la
propiedad Copiar en el directorio de resultados, colocndola en Copiar siempre.
189
06_Silverlight.qxp 9/30/09 1:33 PM Page 190
6. CERRAR EL CRCULO
DispatcherTimer reloj;
public Page()
{
InitializeComponent();
reloj = new DispatcherTimer();
reloj.Tick += new EventHandler(reloj_Tick);
reloj.Interval = TimeSpan.FromSeconds(0.1);
reloj.Start();
}
_` MP3 GRATUITOS
En los ejemplos usamos MP3 del lbum Ghost del grupo Nine Inch Nails. Este CD es provisto por
la banda de manera gratuita y es de libre uso y distribucin. A pesar de esto, ha generado exce-
lentes ganancias. Este lbum puede ser descargado desde la pgina http://ghosts.nin.com.
190
06_Silverlight.qxp 9/30/09 1:33 PM Page 191
MediaElement
191
06_Silverlight.qxp 9/30/09 1:33 PM Page 192
6. CERRAR EL CRCULO
Para cada accin o evento necesitamos crear su manejador en el cdigo C#. Tam-
bin notaremos, en el siguiente cdigo, que hemos asignado valores al control
Slider sobre la base de las caractersticas del archivo por reproducir.
DispatcherTimer reloj;
public Page()
{
InitializeComponent();
reloj = new DispatcherTimer();
reloj.Tick += new EventHandler(reloj_Tick);
reloj.Interval = TimeSpan.FromSeconds(0.1);
reloj.Start();
}
192
06_Silverlight.qxp 9/30/09 1:33 PM Page 193
MediaElement
Microsoft pone nuestra disposicin un sitio web en el que se ensean tcnicas avanzadas en el uso
del producto Microsoft Expression Blend. En este sitio, podremos aprender tcnicas para optimi-
zar el uso de videos, la aplicacin de efectos y movimiento sobre los objetos XAML y hasta la in-
terfaz de esta aplicacin. En http://expression.microsoft.com buscamos Learn Expression Blend.
193
06_Silverlight.qxp 9/30/09 1:33 PM Page 194
6. CERRAR EL CRCULO
Video
Iniciamos el captulo con la reproduccin de sonidos y msica, ya que era un punto
pendiente si tenemos en cuenta el ejemplo creado en el captulo 2. A pesar de esto, el
tratamiento de video con el control MediaElement tiene an ms que ofrecer. Si bien
no es competencia de este libro hablar de las caractersticas del streaming de videos des-
de servidores web, s veremos cmo Silverlight nos brinda soporte para esto mediante
el control MediaElement, pudiendo aplicar el video sobre superficies, leer y reconocer
la informacin contenida en l, entre otras caractersticas. En la actualidad, el control
MediaElement soporta la reproduccin de los siguientes formatos de video:
Como podemos notar, los formatos de video son los provistos por Microsoft y se
centran en el WMV (Windows Media Video). Por este motivo, es necesario con-
tar con algn convertidor de video a la hora de querer reproducir video con Sil-
verlight. Encontraremos variadas herramientas tiles para esto, como Windows
Movie Maker incluida en la mayora de las versiones de Windows, o, dentro del
conjunto de herramientas Expression, Microsoft Expression Encoder 2.
194
06_Silverlight.qxp 9/30/09 1:33 PM Page 195
MediaElement
Si bien la versin 2 de Silverlight puede resultar limitada en la cantidad de formatos posibles para
reproduccin de video, la siguiente versin de Silverlight, Silverlight 3, contar con pleno soporte
para los formatos de video ms conocidos, incluidos los utilizados por Adobe Flash y QuickTime.
195
06_Silverlight.qxp 9/30/09 1:33 PM Page 196
6. CERRAR EL CRCULO
pintar un video sobre otros elementos, sino que podramos aplicarlo sobre cualquier
otro control que posea propiedades de pintado. Como vemos en el siguiente cdi-
go, pintamos el mismo video sobre la superficie de un control Button.
Marcadores de video
Cuando trabajamos con videos, existe la posibilidad de agregarles marcas con
identificaciones especiales. Estas marcas, en ocasiones, son usadas para hacer
avanzar el video hasta la marca en cuestin y darle la posibilidad al usuario de ele-
gir el punto para comenzar a visualizar el video.
El control MediaElement puede leer las marcas en los videos para otorgar la mis-
ma posibilidad, esto es, desplazar el video hasta el punto en el que se encuentre
esa marca. El primer paso para trabajar con marcadores es poder reconocerlos.
196
06_Silverlight.qxp 9/30/09 1:33 PM Page 197
MediaElement
El control MediaElement posee un evento que nos avisar cada vez que pase por
un marcador. En el siguiente cdigo, hacemos uso de este evento para mostrar
los marcadores incluidos en el video:
<MediaElement Source=SilverLightConMarcadores.wmv
Width=300 Margin=50,25,50,84
MarkerReached=MediaElement_MarkerReached/>
<TextBlock x:Name=TextoMarcas VerticalAlignment=Bottom Text=
TextWrapping=Wrap Margin=8,0,8,8 Height=59/>
Cada vez que se pase por un marcador, se disparar el evento MarkerReached, escri-
biendo la descripcin y la posicin de tiempo en la que se encuentra esta marca.
197
06_Silverlight.qxp 9/30/09 1:33 PM Page 198
6. CERRAR EL CRCULO
Ya que podemos detectar cada marca, sera sencillo reconocer todos los marcadores
de un video para presentrselos al usuario y que ste pueda saltar entre ellos y as
navegar con mayor facilidad dentro de la reproduccin en curso.
TimelineMarker miMarcador;
198
06_Silverlight.qxp 9/30/09 1:33 PM Page 199
Deep Zoom
MediaElement tiene an mucho ms por ofrecer y, por esto, iremos develando sus
caractersticas en los siguientes captulos. De cualquier manera, en este punto nos
habremos dado cuenta de que la potencia de Silverlight y el manejo de elementos
multimedios no son una limitacin, sino que, por el contrario, pueden darnos mu-
chas ventajas en el desarrollo de aplicaciones.
DEEP ZOOM
El concepto de Deep Zoom es el de proveer una herramienta para manipular
imgenes de gran tamao dentro de las aplicaciones Silverlight, con el objetivo
de aligerar la transmisin de ellas al cliente. Adems de esto, permite agregar fun-
cionalidades de acercamiento gradual o zoom. Pensemos en Deep Zoom como
en una tcnica que despliega imgenes para el cliente, quien puede acercarse y ob-
servar los detalles de estas imgenes sobre la base de su resolucin. As, si conta-
mos con imgenes de alta definicin, que por lo general son de varios megabytes,
transmitiremos toda la imagen con el mximo de sus detalles segn la demanda
de informacin que el cliente requiera, sin tener que mover toda la imagen hasta
el cliente desde el principio, lo que significara lentitud en la carga de la aplica-
cin y un elevado consumo de recursos para la transmisin de los datos.
Si bien existe en el mercado este tipo de tecnologa y no podramos decir que es
nueva, Deep Zoom marca una diferencia en la forma en cmo es presentada la
informacin. Esto se debe a que, en lugar de mostrar diferentes imgenes basadas
en el grado de zoom que realicemos, Deep Zoom transmitir la imagen actual de
acuerdo con el rango de visin, con la mejor resolucin posible, haciendo un ba-
lance entre calidad y costo de la transmisin de informacin hacia el cliente. De
esta forma, no veremos saltos entre cada uno de los grados de zoom y siempre ob-
tendremos una imagen de alta calidad obtenida desde la imagen original.
Si queremos empezar a trabajar con Deep Zoom, necesitaremos descargar la aplicacin
Deep Zoom Composer desde el sitio web de Microsoft. Deep Zoom Composer no
tienen ningn costo asociado, por lo que podremos descargarlo y usarlo libremente.
Hard Rock Cafe fue uno de los primeros sitios en utilizar la tecnologa Deep Zoom. La empresa
lo implement en su web para que los usuarios pudieran ver la coleccin de objetos, cartas, ins-
trumentos y otros elementos que poseen y que fueran entregados por diferentes artistas de la
msica. Podemos ver el sitio de Memorabilia en http://memorabilia.hardrock.com.
199
06_Silverlight.qxp 9/30/09 1:33 PM Page 200
6. CERRAR EL CRCULO
Hasta la fecha, Deep Zoom Composer slo se encuentra disponible en idioma ingls.
A pesar de esto, su uso resulta simple e intuitivo, por lo que no tendremos problemas
en entender los pasos de la creacin de este tipo de proyectos. Entonces, presionamos
sobre la opcin New Project. Al hacerlo, veremos la ventana para la creacin del nue-
vo proyecto, donde introduciremos su nombre y la ruta fsica donde se alojar. Con el
proyecto creado, necesitamos completar tres pasos antes de obtener el producto final.
El primero es la importacin de imgenes a partir del botn Import, ubicado en la
parte superior. Podremos importar tantas como necesitemos y, si bien uno de los pa-
sos es acomodar estas imgenes segn cmo queramos que se visualicen, es recomen-
dable, en caso de tener mltiples imgenes que juntas formen una sola, utilizar otras
herramientas externas de composicin de imgenes para unirlas en una, ya que Deep
Zoom Composer slo nos proveer de elementos bsicos para hacer este trabajo. Una
vez adicionadas las imgenes, stas aparecern en la lista de la derecha.
200
06_Silverlight.qxp 9/30/09 1:34 PM Page 201
Deep Zoom
201
06_Silverlight.qxp 9/30/09 1:34 PM Page 202
6. CERRAR EL CRCULO
El ltimo paso consiste en generar el proyecto exportndolo al formato que pueda en-
tender Silverlight. Para esto, presionamos sobre la ltima opcin de las tres superio-
res, llamada Export. Al hacer esto, tendremos que elegir el formato de exportacin del
proyecto. Si necesitamos ver un ejemplo completo de la implementacin de Deep
Zoom basado en nuestro proyecto, podremos elegir la opcin Silverlight Deep Zoom.
sta crear un proyecto completo Silverlight que incluya botones para realizar zooms
y movimientos sobre las imgenes incluidas en l. Si, por el contrario, tenemos cierta
experiencia en la inclusin del resultado de Deep Zoom Composer en aplicaciones
Silverlight, elegiremos la opcin Images para que la aplicacin cree slo los archivos
necesarios para que incluyamos, por nuestra cuenta, el proyecto Deep Zoom en nues-
tra aplicacin Silverlight. Tambin es posible elegir la calidad de la representacin de
las imgenes que se van a mostrar. En la Figura 10, en la parte inferior derecha, vemos
las opciones de compresin de imagen. Esta compresin modifica el resultado de las
imgenes del archivo Deep Zoom resultante. Modificar estos valores podra acelerar
el proceso de descarga de las imgenes hacia el cliente, pero al mismo tiempo, un al-
to nivel de compresin podra deteriorar la calidad de las imgenes.
Figura 10. Vista final de Deep Zoom Composer para la exportacin del proyecto.
Una vez que el proyecto fue generado y, dependiendo de las opciones que hubira-
mos elegido para generarlo, se nos presentar la opcin de acceder al resultado. Es-
ta opcin nos llevar a la carpeta con los resultados del proyecto. El proyecto en s
es representado por un conjunto de archivos entre los que se encuentran los dife-
rentes muestreos de imgenes relacionados con las imgenes utilizadas para crear el
proyecto Deep Zoom, adems de archivos XML con meta datos.
202
06_Silverlight.qxp 9/30/09 1:34 PM Page 203
Deep Zoom
Notaremos que el proyecto web contiene una carpeta llamada ClientBin. Esta car-
peta es la contenedora de los resultados que obtenemos luego de la compilacin
203
06_Silverlight.qxp 9/30/09 1:34 PM Page 204
6. CERRAR EL CRCULO
Figura 13. En el rbol de soluciones, vemos los archivos del proyecto Deep Zoom.
Una vez que tenemos los archivos en su lugar, usaremos el control MultiScaleImage
para desplegarlas en el proyecto. Podemos ver un ejemplo a continuacin.
<UserControl x:Class=Capitulo6MiDeepZoom.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300>
<Grid x:Name=LayoutRoot Background=White>
<MultiScaleImage x:Name=MiDeepZoom Width=350 Height=250
Source=mideepzoom/dzc_output.xml></MultiScaleImage>
</Grid>
</UserControl>
Observemos que el motivo por el que colocamos el proyecto Deep Zoom dentro de
la misma carpeta donde se despliega el resultado de la aplicacin Silverlight es para
que resulte ms simple poder accederla. Tambin es importante el archivo al cual
se hace referencia, que es dzc_output.xml, archivo que contiene los metadatos del
proyecto, como lista de imgenes y direcciones, entre otros.
204
06_Silverlight.qxp 9/30/09 1:34 PM Page 205
Deep Zoom
El paso que hicimos slo mostrar el proyecto si desplegamos el estado inicial que hu-
biramos configurado en el momento de crear el proyecto en Deep Zoom Composer.
Necesitaremos hacer algo de cdigo para crear la interaccin con las imgenes y que el
comportamiento de Deep Zoom se haga presente. Primero, modificaremos un poco el
cdigo XAML para incluir llamadas a los eventos que se relacionan con el mouse.
Estos eventos se dispararn cuando el botn izquierdo del ratn sea presionado,
cuando se mueva e, incluso, cuando deje la zona en la que se est presentando el
proyecto Deep Zoom. Cada uno de estos eventos tendr el cdigo asociado co-
mo podemos ver a continuacin:
205
06_Silverlight.qxp 9/30/09 1:34 PM Page 206
6. CERRAR EL CRCULO
if (RatonArrastrando)
{
Point newOrigin = new Point();
newOrigin.X = PosicionActual.X - (((e.GetPosition(MiDeepZoom).X -
DesfaseArrastre.X) / MiDeepZoom.ActualWidth) *
MiDeepZoom.ViewportWidth);
newOrigin.Y = PosicionActual.Y - (((e.GetPosition(MiDeepZoom).Y -
DesfaseArrastre.Y) / MiDeepZoom.ActualHeight) *
MiDeepZoom.ViewportWidth);
MiDeepZoom.ViewportOrigin = newOrigin;
}
}
Si necesitamos saber cmo manejar la rueda del mouse para realizar zoom, podemos generar
un proyecto Deep Zoom con Deep Zoom Composer, que tambin genere un proyecto Silverlight
para incluir el resultado de Deep Zoom. El cdigo generado por Deep Zoom Composer nos otor-
gar excelente cdigo de ejemplo para nuestras implementaciones.
206
06_Silverlight.qxp 9/30/09 1:34 PM Page 207
Deep Zoom
El cdigo anterior puede resultar confuso a primera vista, pero todo se reduce al
mtodo ZoomAboutLogicalPoint provisto por el control MultiScaleImage. Este m-
todo es el encargado de generar el efecto de zoom basado en un factor de zoom,
tanto positivo como negativo, as como sobre la base de un punto XY. Este m-
todo se ejecuta en el mtodo Zoom del cdigo anterior, ya que las dems lneas
de cdigo se encargan de administrar el estado del mouse antes de realizar algu-
na accin. Si ejecutamos el proyecto, veremos que al presionar sobre la imagen
se realizar el acercamiento a ella, mientras que si lo hacemos presionando la te-
cla SHIFT (maysculas) al mismo tiempo que pulsamos el botn del mouse, la
imagen se alejar. A continuacin, un ejemplo.
207
06_Silverlight.qxp 9/30/09 1:34 PM Page 208
6. CERRAR EL CRCULO
<InkPresenter></InkPresenter>
El tag XAML del control InkPresenter agregar el lienzo de dibujo a nuestra apli-
cacin, y slo podremos dibujar sobre l. Por este motivo, el control InkPresenter
deber estar declarado por encima de cualquier otro elemento. Si algn otro com-
ponente se dibujara sobre el control InkPresenter, no podramos visualizarlo y tam-
poco escribir sobre l, ya que los eventos relacionados con la captura de informacin
no seran alcanzados. Para entender esto, pensemos en capas u hojas de dibujo.
La capa superior y visible, la ms cercana al usuario, es la que puede interactuar con
l, capturando cualquier tipo de accin que el usuario realice, dejando a las capas
RRR COLORES
Los tipos de datos para colores en XAML son representados en formato hexadecimal, de ma-
nera similar al utilizado en HTML, con la diferencia de que, en Silverlight, se incluye un par de
nmeros iniciales para especificar el nivel de transparencia de ese color. Si contamos con
#FF000000, obtenemos un color negro pleno y sin transparencias.
208
06_Silverlight.qxp 9/30/09 1:34 PM Page 209
inferiores fuera del alcance de estos eventos. Por eso, deberemos asegurarnos de que
el control InkPresenter se posicione sobre la capa superior y ms cercana al usuario.
Veamos, ahora, la declaracin completa del control InkPresenter.
Del cdigo anterior, los atributos destacables son los tres eventos relacionados
con la accin de escritura. A continuacin, veamos sus detalles:
209
06_Silverlight.qxp 9/30/09 1:34 PM Page 210
6. CERRAR EL CRCULO
Antes de comenzar a crear cdigo para poder dibujar sobre InkPresenter, es ne-
cesario configurar los lmites de dibujo ya que, si bien el control representa un
elemento rectangular, podemos especificar los espacios donde se podr escribir o
no. Esto puede resultar muy verstil cuando necesitamos adaptar las caracters-
ticas de dibujo a una zona en particular.
public Page()
{
InitializeComponent();
Limites();
}
Los lmites elegidos en este caso son representados por un rectngulo con el mis-
mo tamao que el control InkPresenter. Esto har que podamos escribir sobre
toda la superficie del control libremente. El siguiente paso es escribir el cdigo
detrs de cada uno de los eventos antes mencionados.
210
06_Silverlight.qxp 9/30/09 1:34 PM Page 211
ColeccionDeEstilos.Add(e.StylusDevice.GetStylusPoints(this.inkPresenter));
pincel = new Stroke(ColeccionDeEstilos);
this.inkPresenter.Strokes.Add(pincel);
}
pincel.StylusPoints.Add(e.StylusDevice.GetStylusPoints(this.inkPresenter));
}
Como vemos en este cdigo, es necesario verificar que el pincel haya sido crea-
do antes de capturar los trazos generados por el mouse. Si no hiciramos esto, el
usuario, al mover el mouse, creara trazos continuos. Por ltimo, incorporamos
el cdigo relacionado al ltimo evento.
Una vez que el botn del mouse es liberado, el pincel se elimina, haciendo que ya
no se dibujen los movimientos del usuario sobre el control.
211
06_Silverlight.qxp 9/30/09 1:34 PM Page 212
6. CERRAR EL CRCULO
Como vemos en la figura anterior, el control InkPresenter puede mostrar trazos ba-
sados en tags creados de manera manual. Veamos, a continuacin, el cdigo XAML:
...
...
<InkPresenter.Strokes>
<StrokeCollection>
<Stroke>
<Stroke.DrawingAttributes>
<DrawingAttributes Color=#FF000000 Width=5
Height=5 />
</Stroke.DrawingAttributes>
<Stroke.StylusPoints>
<StylusPoint X=10 Y=10 />
<StylusPoint X=100 Y=10 />
212
06_Silverlight.qxp 9/30/09 1:34 PM Page 213
Cada tag <Stroke> dentro del tag <StrokeCollection> representa un trazo nico. Esto
es el equivalente a que el usuario hubiera creado dicho trazo sin dejar de presionar el
botn del mouse. El tag <Stroke.DrawingAttributes> representa la caracterstica del
trazado. En el ejemplo, ste muestra un grosor de 5 pixeles de ancho y 5 pixeles de
alto, adems de ser de color negro. Por ltimo, encontramos cada uno de los puntos
del trazo representados por la coleccin <Stroke.StylusPoints>, que contendr cada
uno de los puntos basados en el tag <StylusPoint>, el cual especifica las coordenadas
XY donde se inicia el punto. Debido a que ste es un nico trazo, al dibujar ms
puntos en diferentes coordenadas, stos se unirnmediante una lnea. Como vemos
en la Figura 17, la unin de los puntos deriv en la construccin de un cuadrado. Y
as como creamos trazos desde el cdigo XAML, tambin podemos hacerlo desde
nuestro cdigo, como observamos en la Figura 18. All, la lnea de color verde es cre-
ada desde el cdigo XAML. Esto se logra siguiendo el mismo patrn que el de XAML.
El siguiente cdigo muestra cmo generar estos trazos desde cdigo C#.
213
06_Silverlight.qxp 9/30/09 1:34 PM Page 214
6. CERRAR EL CRCULO
trazo.StylusPoints.Add(coleccionEstilos);
this.inkPresenter.Strokes.Add(trazo);
}
214
06_Silverlight.qxp 9/30/09 1:34 PM Page 215
...
StylusPointCollection coleccionEstilos = new StylusPointCollection();
El control InkPresenter puede contener otros controles, por lo que, para lograr
lo visto en la figura anterior, tendremos que agregar el control Image como con-
tenido del control InkPresenter. Veamos cmo hacerlo:
215
06_Silverlight.qxp 9/30/09 1:34 PM Page 216
6. CERRAR EL CRCULO
MouseLeftButtonDown=inkPresenter_MouseLeftButtonDown
MouseMove=inkPresenter_MouseMove
LostMouseCapture=inkPresenter_LostMouseCapture>
<Image Source=Colinas azules.jpg Width=384 Height=284/>
</InkPresenter>
Luego, podremos intercambiar este elemento interno por cualquier otro capaz
de representar algn medio visual. El cdigo para escribir sobre video resultar
similar al anterior. En este caso, utilizamos un control MediaElement para des-
plegar el video y escribir sobre l. En la Figura 20 que encontramos debajo pode-
mos ver un ejemplo del resultado que se podra obtener.
MouseLeftButtonDown=inkPresenter_MouseLeftButtonDown
MouseMove=inkPresenter_MouseMove
LostMouseCapture=inkPresenter_LostMouseCapture>
<MediaElement Source=silverlight.wmv AutoPlay=True />
</InkPresenter>
216
06_Silverlight.qxp 9/30/09 1:34 PM Page 217
<InkPresenter x:Name=inkPresenter
Width=300 Height=200 Background=Aqua
MouseLeftButtonDown=inkPresenter_MouseLeftButtonDown
MouseMove=inkPresenter_MouseMove
LostMouseCapture=inkPresenter_LostMouseCapture
Clip=M0.5,25.5 C0.5,11.692881 11.692881,0.5 25.5,0.5 L267,0.5
C280.80713,0.5 299,19.192881 299,33 L299,169 C299,182.80713 289.80713,201
276,201 L29,201 C15.192881,201 0.5,186.80713 0.5,173 z />
Si bien los valores introducidos en la propiedad Clip pueden resultar complejos de en-
tender y de crear en forma manual, Expression Blend 2 nos otorga herramientas para
hacerlo de manera visual y ms simple. All, creamos el contorno que vamos a aplicar,
y luego copiamos y pegamos el resultado en el control InkPresenter. Primero debere-
mos agregar un elemento de dibujo al lienzo. Podremos usar elipses o rectngulos. Una
217
06_Silverlight.qxp 9/30/09 1:34 PM Page 218
6. CERRAR EL CRCULO
Para aplicar el trazado, copiaremos el valor del atributo Data del trazado al atributo
Clip de InkPresenter. Como resultado, en este caso obtendremos el siguiente cdigo:
218
06_Silverlight.qxp 9/30/09 1:34 PM Page 219
<InkPresenter x:Name=inkPresenter
Width=300 Height=250 Background=Aqua
MouseLeftButtonDown=inkPresenter_MouseLeftButtonDown
MouseMove=inkPresenter_MouseMove
LostMouseCapture=inkPresenter_LostMouseCapture
Clip=M289.97556,99.001045 C255.73196,134.51219 198.63127,225.33125
119.70698,220.46407 C73.678635,217.62555 -25.515903,142.05704
16.996023,143.14827 C35.799923,143.63094 25.502108,94.232025
33.899151,74.349686 C49.08622,38.390076 115.76089,-10.094691
156.73918,49.198044 C206.78326,121.60835 319.49466,68.389313
289.97556,99.001045 z />
RESUMEN
Videos, imgenes escalables y capacidades de dibujo; herramientas de Silverlight que pueden
enriquecer nuestras aplicaciones de una forma inmensurable. Si los controles y componentes,
junto a sus capacidades vistas en captulos anteriores, no nos haban despertado an la imagi-
nacin, poder manipular imgenes de alta resolucin o escribir sobre cualquier superficie es
lo que faltaba para romper la barrera de lo tradicional y forzarnos a crear aplicaciones que pre-
senten el contenido de formas antes impensadas.
219
06_Silverlight.qxp 9/30/09 1:34 PM Page 220
ACTIVIDADES
1 Qu formatos de audio soporta Silverlight 2? 1 Intente reproducir sonidos desde una di-
reccin web remota, haciendo uso del con-
2 Mediante qu mtodos podemos saber la trol MediaElement.
posicin actual de reproduccin de un soni-
do o msica? 2 InkPresenter para Windows Presentation
Foundation posee la capacidad de recono-
3 Qu mtodo es necesario ejecutar para cer la escritura y transformarla a letras.
quitar el sonido por completo de una re- Intente implementar esta caracterstica.
produccin en curso?
3 Recolecte la informacin creada con Ink-
4 Qu control necesitamos para reproducir Presenter y almacnela en formato XML.
video en las aplicaciones Silverlight 2?
4 Con la informacin recolectada en el ejer-
5 Cules son los formatos de video que pue- cicio anterior, trate de volver a mostrarla
den ser manejados por Silverlight 2? en la aplicacin Silverlight 2.
220
07_Silverlight.qxp 9/30/09 1:35 PM Page 221
Silverlight Captulo 7
Interconexin
En el ambiente de Internet, aquello
7. INTERCONEXIN
SILVERLIGHT DESDE C#
Es posible que una de las reas ms atractivas del desarrollo de software sea la que se
refiere a la creacin de juegos. En sta se suelen aplicar muchas ciencias y tcnicas
externas del software, como el uso de la fsica o la matemtica. Al mismo tiempo, en
este tipo de desarrollo nos encontramos con acertijos lgicos que desafan nuestro
intelecto al tratar de optimizar al mximo el uso de recursos del equipo o para en-
contrar la mejor forma posible de mover elementos por la pantalla y simular anima-
ciones tpicamente relacionadas con los juegos. Iniciemos, entonces, el uso intensivo
de C# para Silverlight con la creacin de un juego. Este juego es bastante conocido y
consiste en armar una imagen desplazando cuadrados, que contienen parte de ella, a
un nico espacio vaco del tablero de juego. Podremos mover slo una parte a la vez,
tratando de formar la imagen previsualizada de manera completa. Primero, crearemos
en el cdigo XAML una superficie de dibujado; para esto, necesitaremos de un con-
trol Canvas y un control Image donde visualizar la figura correctamente ensamblada.
<UserControl x:Class=Capitulo7ModificacionCanvas.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=810 Height=300
222
07_Silverlight.qxp 9/30/09 1:35 PM Page 223
Silverlight desde C#
xmlns:d=http://schemas.microsoft.com/expression/blend/2008
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
mc:Ignorable=d>
<Grid x:Name=LayoutRoot Background=White>
<Canvas x:Name=ContenedorJuego />
<Image Source=Froblins4.png
Height=300 Width=400 Stretch=Fill
HorizontalAlignment=Right d:LayoutOverrides=HorizontalAlignment,
Width/>
<TextBlock Visibility=Collapsed HorizontalAlignment=Left
VerticalAlignment=Top Text=Has Ganado! TextWrapping=Wrap
Margin=109,132,0,0 FontSize=20 Width=144.658 FontWeight=Bold
FontFamily=Interfaz de usuario porttil x:Name=textblockGanador/>
</Grid>
</UserControl>
El segundo paso consta de la creacin del tablero de juego. Para esto, crearemos
cdigo que cargue la imagen de manera dinmica desde una direccin web dada.
223
07_Silverlight.qxp 9/30/09 1:35 PM Page 224
7. INTERCONEXIN
public Page()
{
InitializeComponent();
CrearTablero();
}
224
07_Silverlight.qxp 9/30/09 1:35 PM Page 225
Silverlight desde C#
this.ContenedorJuego.Children.Add(vectorCanvas[n]);
}
barajar();
dibujarTablero();
}
Notemos que, por medio del objeto Uri, hacemos referencia a la imagen que se va a
cargar, imagen que ser usada para definir el tablero de juego. Luego, con dos bucles,
definimos las partes de la imagen, tanto horizontales como verticales. En el bucle
interno notamos que, usando la librera de clases de Microsoft .Net, en Silverlight po-
demos crear nuestras propias imgenes. En este caso, con la siguiente instruccin:
En l, creamos un nuevo rectngulo de 100 pixeles de ancho por 100 pixeles de alto,
desplazndolo una cantidad en X y otra en Y sobre la imagen previamente cargada.
Pensemos en esta accin como si estuviramos enfocando slo parte de una imagen
ms grande, en la cual desplazamos un rectngulo de visin por sobre una sola sec-
cin de 100 pixeles de ancho por 100 pixeles de alto. Acto seguido, asignamos este
rectngulo a la propiedad Clip de la imagen. Recordaremos esta propiedad vista en el
captulo anterior, cuando trabajbamos con videos e InkPresenter. Esta propiedad li-
mitar el rea de visin de la imagen slo al rectngulo previamente creado. Al final
del mtodo ya descrito, encontramos la llamada a dos mtodos ms, uno para mez-
clar o barajar las imgenes y otro para dibujar el tablero de juego en el estado actual.
225
07_Silverlight.qxp 9/30/09 1:35 PM Page 226
7. INTERCONEXIN
tablero[i] = i;
}
Random randomizador = new Random(System.DateTime.Now.Second);
for (int i = 0; i < 100; i++)
{
int numero1 = randomizador.Next(15);
int numero2 = randomizador.Next(15);
if (numero1 != numero2)
{
int temporal = tablero[numero1];
tablero[numero1] = tablero[numero2];
tablero[numero2] = temporal;
}
}
tablero[15] = -1;
}
}
}
}
226
07_Silverlight.qxp 9/30/09 1:35 PM Page 227
Silverlight desde C#
El paso final es el de darle movimiento e interaccin con el usuario. As, cada vez que
el usuario presione una de las imgenes, sta deber ocupar el espacio en blanco conti-
guo, si lo hubiere, y dejar su espacio libre para que otra imagen pueda ocuparlo.
227
07_Silverlight.qxp 9/30/09 1:35 PM Page 228
7. INTERCONEXIN
if ((espacioTablero == espacioVacio + 1) ||
(espacioTablero == espacioVacio - 1) ||
(espacioTablero == espacioVacio + 4) ||
(espacioTablero == espacioVacio - 4))
{
int x = espacioVacio / 4;
int y = espacioVacio % 4;
Curiosamente, uno de los sitios ms populares para la visualizacin de videos, YouTube, us los
servicios de streaming de Silverlight para transmitir los eventos en vivo de March Madness. Es-
tos eventos pueden ser vistos en la siguiente direccin: www.youtube.com/marchmadness.
228
07_Silverlight.qxp 9/30/09 1:35 PM Page 229
Silverlight desde C#
vectorCanvas[identificadorCanvas].SetValue(Canvas.TopProperty,
Convert.ToDouble(y * 100));
vectorCanvas[identificadorCanvas].SetValue(Canvas.LeftProperty,
Convert.ToDouble(x * 100));
tablero[espacioVacio] = identificadorCanvas;
tablero[espacioTablero] = -1;
verificarGanador();
}
}
Podemos notar que el evento donde se captura el presionado del mouse fue en-
lazado de manera manual en la inicializacin de la aplicacin Silverlight mediante
el cdigo que vemos a continuacin:
vectorCanvas[n].MouseLeftButtonDown += new
MouseButtonEventHandler(Page_MouseLeftButtonDown);
Debido a eso, esta accin ser capturada por el mtodo antes descrito; mtodo
que podemos ver en la siguiente lnea:
En este mtodo, se identifica qu objeto origin el evento de presionado del botn del
mouse, buscando en la lista de objetos Canvas cul concuerda con el que ejecut el
, UN PASO MS ALL
Slo con agregar un poco ms de funcionalidad al ejemplo planteado, podramos tener un juego
an ms complejo. Pensemos en la posibilidad de adicionar una lista de imgenes de las que se-
leccionar, modificar la dificultad agregando ms divisiones a la imagen, etctera. Nuestro nico
lmite es la imaginacin.
229
07_Silverlight.qxp 9/30/09 1:35 PM Page 230
7. INTERCONEXIN
WebClient
El objeto WebClient nos da la posibilidad de enviar y recibir informacin de for-
ma asncrona desde y hacia cualquier destino conformado por una direccin URL
(Uniform Resource Locator o en castellano, localizador uniforme de recursos). Con
WebClient podramos, por ejemplo, leer informacin de texto que se encuentre
en cualquier parte de una web, o conocer noticias en formato RSS (Really Simple
Syndication, o en castellano, distribucin simple de contenido). De igual forma,
podramos consumir cualquier otro tipo de informacin que nos retornara algu-
na forma de texto desde la Web. En el siguiente ejemplo, crearemos un lector
de noticias en formato RSS, haciendo uso del objeto WebClient y XLinQ para ma-
nipular las consultas sobre el contenido. Como primera instancia, crearemos los
controles XAML donde se mostrarn los resultados de la consulta.
<UserControl xmlns:data=clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data
x:Class=Capitulo7WebClient.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300>
230
07_Silverlight.qxp 9/30/09 1:35 PM Page 231
Silverlight desde C#
public Page()
{
InitializeComponent();
WebClient conectorWeb = new WebClient();
Uri direccionRSS = new Uri(http://feeds2.feedburner.com/redusers);
conectorWeb.Encoding = Encoding.UTF8;
conectorWeb.DownloadStringCompleted +=
new
DownloadStringCompletedEventHandler(conectorWeb_DownloadStringCompleted);
conectorWeb.DownloadStringAsync(direccionRSS);
}
231
07_Silverlight.qxp 9/30/09 1:35 PM Page 232
7. INTERCONEXIN
232
07_Silverlight.qxp 9/30/09 1:35 PM Page 233
Silverlight desde C#
this.RssFeed.ItemsSource = RSS;
}
Una vez que la descarga del contenido es ejecutada, tomaremos este contenido desde
los argumentos del evento. El objeto e posee una propiedad llamada Result (resulta-
dos), donde se encontrar el contenido de la descarga. Este contenido es asignado a
un objeto del tipo XDocument, objeto que puede administrar XML para facilitar su
manipulacin. Por ltimo, mediante una consulta XLinQ, se toman los datos im-
portantes como ttulo, descripcin e hipervnculo de acceso a la noticia, alojando
todos los resultados dentro de una coleccin de objetos del tipo EntidadRSS. sta es
una entidad que creamos para este caso y que podemos ver a continuacin.
Enviar informacin
As como hemos podido obtener informacin desde una fuente de datos remota, es
posible enviar informacin hacia la fuente y esperar una respuesta basada en esto. Po-
demos hacer uso del mismo modelo antes planteado, pero adicionndole parmetros
233
07_Silverlight.qxp 9/30/09 1:35 PM Page 234
7. INTERCONEXIN
Utilizaremos el sitio web existente para que acte como recolector de mensajes, el
que leer la informacin enviada por la aplicacin Silverlight y devolver una res-
puesta para mostrar en ella. Implementaremos HttpHandler (manejadores web)
para que representen nuestros puntos de entrada de datos. Para lograr esto, dentro
del archivo Web.Config del sitio web, tendremos que agregar el manejador en cues-
tin. Junto con los manejadores creados por defecto, adicionaremos el nuestro.
<httpHandlers>
<remove verb=* path=*.asmx/>
<add verb=* path=capturaDeInformacion.aspx
type=Capitulo7Posting.Web.ManejadorHTTP, Capitulo7Posting.Web/>
<add verb=* path=*.asmx validate=false
type=System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35/>
<add verb=* path=*_AppService.axd validate=false
234
07_Silverlight.qxp 9/30/09 1:35 PM Page 235
Silverlight desde C#
type=System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35/>
<add verb=GET,HEAD path=ScriptResource.axd
type=System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35
validate=false/>
</httpHandlers>
En el HttpHandler declarado, ste tomar todas las peticiones que se realicen dentro
de nuestro sitio web bajo el nombre de capturaDeInformacion.aspx. Todas las peticio-
nes que se realicen bajo este nombre sern redirigidas a la clase ManejadorHTTP, por lo
que deberemos adicionar esta clase y su cdigo respectivo a nuestra aplicacin web.
context.Response.Write(<Canvas
xmlns=http://schemas.microsoft.com/client/2007 +
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml> +
RRR HTTPHANDLER
Un HttpHandler nos otorga la posibilidad de capturar entradas HTTP a nuestro sitio web bajo un
nombre especfico, sin tener que contar necesariamente con la pgina web fsica. Para poder
usar HttpHandler, es necesario especificar el nombre de la clase que manejar la peticin, as
como el espacio de nombre que la contiene.
235
07_Silverlight.qxp 9/30/09 1:35 PM Page 236
7. INTERCONEXIN
<UserControl x:Class=Capitulo7Posting.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300
xmlns:d=http://schemas.microsoft.com/expression/blend/2008
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
mc:Ignorable=d>
<Grid x:Name=LayoutRoot Background=White>
<Grid.RowDefinitions>
<RowDefinition Height=0.16*/>
<RowDefinition Height=0.84*/>
</Grid.RowDefinitions>
236
07_Silverlight.qxp 9/30/09 1:35 PM Page 237
Silverlight desde C#
<Grid.ColumnDefinitions>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Margin=57,8,0,18 Text= TextWrapping=Wrap Width=143
HorizontalAlignment=Left x:Name=textBox/>
<Button Click=Button_Click HorizontalAlignment=Right
Margin=0,8,153,18 Content=Enviar d:LayoutOverrides=Width,
Height/>
<TextBlock HorizontalAlignment=Left Margin=8,14,0,18
Text=Mensaje: TextWrapping=Wrap d:LayoutOverrides=Height/>
<StackPanel x:Name=contenedor Margin=8,8,8,8 Grid.Row=1/>
</Grid>
</UserControl>
Si bien ya hemos visto este cdigo en diferentes ocasiones, debemos destacar la pre-
sencia del control StackPanel al final del cdigo XAML. En este control, aplicaremos
la respuesta del elemento HttpHandler ya creado. Por ltimo, creamos el cdigo que
manejar la peticin y crear el control Silverlight basado en su cdigo XAML.
237
07_Silverlight.qxp 9/30/09 1:35 PM Page 238
7. INTERCONEXIN
Esto garantizar que el HttpHandler pueda leer el valor introducido por el usua-
rio y actuar en consecuencia. En el cdigo, aparece un nuevo objeto que todava
no habamos visto. Este objeto XamlReader permite crear controles Silverlight a
partir del texto representativo en XAML. Este control carga el texto devuelto por
el HttpHandler y crea una nueva instancia del control en cuestin. Finalmente, adi-
cionamos este resultado a la lista de controles hijo del StackPanel.
Cuando usamos las entradas del usuario como parmetros en nuestras aplicaciones, debere-
mos tener sumo cuidado. Las entradas de los usuarios siempre deben ser comprobadas para
que no contengan caracteres o cdigo ejecutable que pueda generar comportamientos no dese-
ados. Cross Site Scripting o SQL Injection son dos de las vulnerabilidades ms comunes.
238
07_Silverlight.qxp 9/30/09 1:35 PM Page 239
Almacenamiento aislado
Como hemos podido comprobar, Silverlight puede salir fuera de su contenedor para
comunicarse con otras aplicaciones conectadas a la red. Si bien slo hemos consumi-
do informacin de pginas web, es posible hacerlo de servicios web, as como de la
nueva plataforma de comunicacin de Microsoft, WCF (Windows Communication
Foundation). Veremos estas alternativas, ms adelante, en este mismo captulo.
ALMACENAMIENTO AISLADO
Silverlight posee un mecanismo para poder guardar informacin de manera local en
el cliente que est ejecutando la aplicacin. Si tenemos experiencia en el desarrollo
web, podramos asociar la idea de este almacenamiento al utilizado por las cookies,
elementos que son almacenados y administrados por el navegador del cliente, usados
por lo general para dejar alguna informacin en ese equipo y que sern consultadas
en posteriores ocasiones. Pero si bien conceptualmente resulta algo similar, el alma-
cenamiento aislado en Silverlight presenta otras caractersticas. Pensemos en esta
funcionalidad como en la posibilidad de tener una parte del disco duro de la m-
quina cliente para almacenar de manera segura informacin desde nuestra aplicacin
Silverlight. Podramos, por ejemplo, cargar archivos desde el cliente, almacenarlos en
este espacio reservado y usarlos luego en nuestra aplicacin. De esta manera, le aho-
rramos al usuario el tiempo de carga y evitamos pedirle que haga el mismo trabajo
todas las veces que use la aplicacin. Por otro lado, esta caracterstica trae consigo un
concepto de seguridad. Tengamos en cuenta que los navegadores web restringen el
239
07_Silverlight.qxp 9/30/09 1:35 PM Page 240
7. INTERCONEXIN
acceso a archivos en el equipo del usuario. De esta forma, se aseguran de que dife-
rentes aplicaciones y sitios web no puedan causar dao alguno al sistema operativo del
usuario. Debido a este impedimento, y para no romper esta condicin, Silverlight nos
permite crear y leer informacin desde el equipo del usuario de manera contenida, sin
poder acceder ms all del espacio reservado para la aplicacin.
IsolatedStorageFile almacen =
IsolatedStorageFile.GetUserStoreForApplication();
Esto retornar una referencia al directorio y al espacio designado para nuestra apli-
cacin. Una vez que tenemos esta referencia, todo lo que leamos o escribamos pasa-
r por este espacio reservado. Si tenemos experiencia en el manejo de archivos bajo
Microsoft .Net, notaremos que el manejo del espacio reservado en Silverlight posee
algunos puntos de contacto con su superior, teniendo diferentes mtodos para cre-
ar, borrar y leer archivos, as como para crear o borrar directorios. Los siguientes son
los mtodos que tenemos a nuestra disposicin para trabajar con el almacn aislado:
240
07_Silverlight.qxp 9/30/09 1:35 PM Page 241
Almacenamiento aislado
Para poder crear un nuevo archivo dentro del almacn, escribiremos lo siguiente:
IsolatedStorageFile almacen;
public Page()
{
InitializeComponent();
almacen = IsolatedStorageFile.GetUserStoreForApplication();
}
Como vemos, para este caso se inicializa el almacn y el evento que disparar el bo-
tn. Usaremos este almacn para crear un archivo llamado archivo.txt, escribiendo
en l la fecha actual. En la Figura 9, ubicada en la pgina siguiente, podemos ob-
servar el resultado obtenido con lo que hemos realizado.
241
07_Silverlight.qxp 9/30/09 1:35 PM Page 242
7. INTERCONEXIN
, CIERRE DE ARCHIVOS
Es importante usar el mtodo Close() despus de cada operacin con archivos para marcar el fin
de su uso y as liberarlo. Si no lo hiciramos, el archivo podra quedar tomado por la aplicacin y,
al tratar de accederlo nuevamente, obtendramos un error ya que el archivo est en uso.
242
07_Silverlight.qxp 9/30/09 1:35 PM Page 243
Almacenamiento aislado
}
this.mensaje.Text = Un archivo ledo. Contenido: + contenido;
}
En este caso, el contenido del archivo es recuperado y almacenado en una variable tem-
poral para luego mostrar su valor en un mensaje, como vemos en la siguiente figura.
Notemos que, una vez que abrimos el archivo para leerlo, podemos especificar
su modo de apertura mediante la enumeracin FileMode. Esta enumeracin po-
see algunas caractersticas especiales:
Ya hemos creado y ledo el archivo. Pero como dijimos, es posible hacer con l
todas las operaciones bsicas con archivos. En este caso, borraremos el archivo
escribiendo el cdigo que aparece en la prxima pgina:
243
07_Silverlight.qxp 9/30/09 1:35 PM Page 244
7. INTERCONEXIN
Todos los archivos son almacenados en una ubicacin especfica dentro del sistema ope-
rativo. En este caso, se ubican en las carpetas que contienen informacin del usuario.
244
07_Silverlight.qxp 9/30/09 1:35 PM Page 245
Almacenamiento aislado
Capacidad de almacenamiento
Por defecto, el espacio disponible para el almacenaje de datos es de 1 megabyte.
Por supuesto, es posible que en determinadas circunstancias necesitemos ms es-
pacio. Debido a que, como comentamos antes, Silverlight respeta el modelo de
seguridad propuesto para el desarrollo web, no podremos aumentar la cantidad
de espacio sin la autorizacin previa por parte del usuario. Pensemos que, de po-
der pasar por alto este tipo de validaciones, estaramos en condiciones de vulne-
rar la seguridad del usuario. Imaginemos que colmamos el total del espacio del
disco duro del cliente sin que ste se entere.
Definitivamente sera un problema y, por tal motivo, el usuario debe estar al tan-
to de esa accin antes de que nosotros podamos utilizar ms del espacio que es
provisto por defecto. Es posible verificar e incrementar la cantidad de espacio
disponible escribiendo el siguiente cdigo:
Es necesario verificar el tamao del almacn antes de hacer la peticin de incremento. Si la cuo-
ta actual fuera del mismo tamao o superior a la que estamos pidiendo, obtendrmos un error
con la advertencia de que la cuota existente es igual o superior a la que reclamamos.
245
07_Silverlight.qxp 9/30/09 1:35 PM Page 246
7. INTERCONEXIN
246
07_Silverlight.qxp 9/30/09 1:35 PM Page 247
Almacenamiento aislado
Almacenar configuraciones
Es posible que necesitemos almacenar valores como textos u objetos complejos, pe-
ro sin la necesidad de tener que crear un archivo por nuestra cuenta. Podramos,
por ejemplo, guardar la lista de productos de un carrito de compras o el nombre del
usuario que est usando la aplicacin, pero sin llegar a tener que generar cdigo para
manipular archivos almacenados de forma fsica. La caracterstica de almacena-
miento aislado nos permite, adems de la manipulacin de archivos, la posibilidad
de almacenar tipos de datos de manera simple y rpida, que se pueda recuperar en
cualquier momento de la misma forma en la que fueron almacenados. Esto quiere
decir que, si guardramos un objeto personalizado, recuperaramos el mismo obje-
to. Crearemos dos botones y una caja de texto para permitir al usuario introducir
texto, que luego guardaremos y recuperaremos utilizando este mecanismo.
247
07_Silverlight.qxp 9/30/09 1:35 PM Page 248
7. INTERCONEXIN
this.aplicacion.Text;
this.aplicacion.Text = ;
}
Como dijimos, es posible almacenar cualquier objeto o lista de stos dentro de es-
tas variables de configuracin. De cualquier manera, es necesario que tengamos en
cuenta que slo podrn ser almacenados aquellos elementos que contengan la cua-
lidad de ser serializados. Esto quiere decir que podremos almacenar elementos,
248
07_Silverlight.qxp 9/30/09 1:35 PM Page 249
Almacenamiento aislado
cuyos tipos de datos puedan ser transformados a XML. Para ilustrar esta posibili-
dad, crearemos una coleccin de entidades, alojndolas primero en una variable de
configuracin que luego recuperaremos para llenar un control DataGrid.
<UserControl xmlns:data=clr-
namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data
x:Class=Capitulo7AlmacenamientoObjetos.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300
xmlns:d=http://schemas.microsoft.com/expression/blend/2008
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
mc:Ignorable=d>
<Grid x:Name=LayoutRoot Background=White>
<Button HorizontalAlignment=Left Margin=8,8,0,0
VerticalAlignment=Top Content=Cargar lista/>
<Button HorizontalAlignment=Left Margin=82,8,0,0
VerticalAlignment=Top Content=Mostrar lista
d:LayoutOverrides=HorizontalAlignment/>
<data:DataGrid Margin=0,51,0,0
x:Name=grillaDeDatos></data:DataGrid>
</Grid>
</UserControl>
El siguiente paso es crear una clase que contenga nuestra entidad y sirva para alma-
cenar datos (podemos ver un ejemplo de esto en los captulos 3 y 4). En el momento
en el que se ejecute el evento Click del botn, cargaremos una lista de nuestras
entidades y las almacenaremos en una variable de configuracin.
249
07_Silverlight.qxp 9/30/09 1:35 PM Page 250
7. INTERCONEXIN
productos.Add(new Productos()
{
Producto = Producto 2,
Cantidad = 20,
Categoria = Categoria 1,
Precio = 50
});
IsolatedStorageSettings.ApplicationSettings[ListaProductos] =
productos;
}
Como podemos ver, se agrega la lista de productos sin realizarle ninguna modi-
ficacin. Esto se debe a que todos los elementos internos de la entidad pueden
ser transformados a XML sin problema alguno. Finalmente, en el evento del se-
gundo botn, leemos estos valores y los asignamos al control DataGrid. Para eso,
el cdigo es el que aparece a continuacin:
RRR SERIALIZACIN
250
07_Silverlight.qxp 9/30/09 1:35 PM Page 251
Almacenamiento aislado
Figura 16. DataGrid cargado con datos tomados desde una variable de configuracin.
OpenFileDialog
OpenFileDialog es un control homnimo del usado en aplicaciones de escritorio. Per-
mite abrir una ventana donde el usuario deber seleccionar un archivo de su equipo,
archivo que podremos leer y manipular. Encontramos este tipo de comportamiento en
pginas web en las que podemos seleccionar un archivo, como fotografas, para alojar-
las en un servidor. El cdigo para crear un objeto del tipo OpenFileDialog es:
OpenFileDialog ventanaDialogo =
new OpenFileDialog();
251
07_Silverlight.qxp 9/30/09 1:35 PM Page 252
7. INTERCONEXIN
mismo tiempo. El ejemplo que vemos a continuacin muestra todos los archivos
cargados por el usuario en un control ListBox.
if (ventanaDialogo.ShowDialog() == true)
{
List<string> listaArchivos = new List<string>();
foreach (FileInfo archivo in ventanaDialogo.Files)
{
listaArchivos.Add(archivo.Name);
}
this.listaDeArchivos.ItemsSource = listaArchivos;
}
}
Luego de que el usuario selecciona los archivos permitidos por el filtro establecido,
todos sus nombres son listados en el control ListBox, como podemos observar en la
Figura 18, ubicada en la pgina siguiente.
252
07_Silverlight.qxp 9/30/09 1:35 PM Page 253
Almacenamiento aislado
Podremos agregar tantos filtros como creamos necesarios. Para lograr esto, modifi-
caremos el filtro inicial incluyendo otros, de la siguiente manera:
253
07_Silverlight.qxp 9/30/09 1:35 PM Page 254
7. INTERCONEXIN
IsolatedStorageFile almacen;
public Page()
{
InitializeComponent();
almacen = IsolatedStorageFile.GetUserStoreForApplication();
}
if (ventanaDialogo.ShowDialog() == true)
{
List<string> listaArchivos = new List<string>();
foreach (FileInfo archivo in ventanaDialogo.Files)
{
listaArchivos.Add(archivo.Name);
using (Stream datosArchivo = archivo.OpenRead())
{
using (IsolatedStorageFileStream datosAlmacen =
almacen.CreateFile(archivo.Name))
{
byte[] buffer = new byte[1024];
int count = 0;
do
{
count = datosArchivo.Read(buffer, 0,
buffer.Length);
if (count > 0)
datosAlmacen.Write(buffer, 0, count);
} while (count > 0);
}
254
07_Silverlight.qxp 9/30/09 1:35 PM Page 255
Manejo de hilos
}
}
this.listaDeArchivos.ItemsSource = listaArchivos;
}
}
MANEJO DE HILOS
Quizs, no estemos familiarizados con el manejo de hilos, tambin llamados threads
por su nombre en ingls. Esta caracterstica es tpica de las aplicaciones de escrito-
rio, donde es posible ejecutar ms de un proceso, funcin o pieza de cdigo de ma-
nera simultnea. Esto quiere decir que podremos tener ms de una pieza funcional de
cdigo dentro de nuestra aplicacin, procesando informacin de manera paralela.
Para entender esto an ms, pensemos en cdigo que podra tomar mucho tiempo
en ejecutarse, como modificar una imagen, insertar registros en una base de datos
de forma masiva o generar un clculo matemtico de alta complejidad. Estos pro-
cesos pueden tomar mucho tiempo en llevarse a cabo, y hacer esperar al usuario
hasta que ese proceso finalice antes de que pueda seguir usando nuestra aplica-
cin, podra resultar poco prctico. De esta forma, estos procesos de alta com-
plejidad podran ser ejecutados de manera paralela haciendo que, en el momento
en el que terminen su ejecucin, nos avisen para que podamos continuar con otro
tipo de tarea. Silverlight no est exento de esta capacidad, a pesar de tener una fir-
ma muy pequea y estar pensado para que sea liviano y rpido.
RRR HILOS
Si bien el uso de hilos puede ser de gran ayuda para la ejecucin de tareas en paralelo, de-
bemos tener en cuenta que ste no es un recurso inagotable y, por ms hilos que creemos y
tareas que ejecutemos en paralelo, el rendimiento de nuestra aplicacin no ser constante.
Es importante no abusar de estos elementos en nuestro cdigo.
255
07_Silverlight.qxp 9/30/09 1:35 PM Page 256
7. INTERCONEXIN
El concepto de hilos
En los diferentes captulos ya hemos tenido algunos contactos con el manejo de hi-
los. Si bien no hemos creado ni declarado hilos de manera explcita, s hemos usado
objetos que poseen un comportamiento similar. Objetos como Storyboard o Timer
son algunos ejemplos de componentes que pueden ejecutar cdigo en un hilo de eje-
cucin distinto del primario definido por la aplicacin, disparando eventos basados
en ciertos estmulos ya configurados. Esto es posible debido a que el sistema opera-
tivo es el que administra los procesos de cada aplicacin que se ejecuta, asignndole
un espacio de tiempo para realizar sus tareas. As, el sistema operativo ir iterando
entre cada uno de estos procesos, adems de sus propios procesos, y de esta forma
permitir que las aplicaciones no tomen el control absoluto de todo el equipo.
Es comn que el manejo de hilos pase desapercibido cuando usamos o desarrolla-
mos cualquier aplicacin, pero pensemos que el hecho de que podamos mover el
puntero del mouse y al, mismo tiempo, escuchar msica o escribir un documento
es gracias a que el sistema operativo, a altsima velocidad, est otorgndole una frac-
cin de tiempo a cada una de estas aplicaciones para que puedan realizar sus traba-
jos. En el caso de las aplicaciones visuales, todo el manejo de la interfaz visual, as
como de la lgica de esa aplicacin, se realiza en un nico hilo de ejecucin. Debi-
do a esto, tener una tarea que capte todo el tiempo disponible otorgado por el sis-
tema operativo para la ejecucin de procesos podra bloquear la interfaz visual,
haciendo pensar que la aplicacin ha sufrido un problema y que no funcionar
correctamente. Para ilustrar esto, veamos el siguiente cdigo:
public Page()
{
InitializeComponent();
ProcesoLargo();
}
}
}
El cdigo anterior no es muy complejo, pero el bucle presentado itera entre valores
bastante amplios bloqueando por completo el hilo principal de ejecucin de la apli-
cacin, lo que hace que no podamos interactuar con ella hasta que el bucle finalice
256
07_Silverlight.qxp 9/30/09 1:35 PM Page 257
Manejo de hilos
por completo. Como resultado de la ejecucin del cdigo anterior, somos proclives
a obtener errores como el que vemos en la siguiente figura.
Para este tipo de tareas, entonces, lo recomendable sera crear un nuevo hilo de
ejecucin para que estas lneas de cdigo se ejecuten en paralelo y as no bloquear
toda la aplicacin. Conozcamos algunas formas de hacerlo.
Temporizador
Una de las primeras implementaciones provistas por Microsoft .Net Framework
que implementan hilos son los temporizadores, tambin conocidos como Timers
por su nombre en ingls. En el caso de Silverlight, tenemos un temporizador
especial dentro del espacio de nombres System.Windows.Threading. Este tempori-
zador es llamado DispatcherTimer y cumple la funcin de disparar un evento basa-
do en un intervalo dado. DispatcherTimer posee las siguientes propiedades:
257
07_Silverlight.qxp 9/30/09 1:35 PM Page 258
7. INTERCONEXIN
Podramos usar DispatcherTimer para generar una aplicacin tipo reloj, actualizando
los minutos o segundos en tiempo real; o en otras implementaciones tales como el
envo de informacin hacia un servicio o pgina web desde nuestra aplicacin
Silverlight sin intervencin del usuario y, al mismo tiempo, sin bloquear el hilo
principal de ejecucin de la aplicacin. En el siguiente ejemplo, vemos cmo apli-
car este temporizador para actualizar el progreso de un control ProgressBar.
<UserControl x:Class=Capitulo7Hilos.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300>
<Grid x:Name=LayoutRoot Background=White>
<ProgressBar x:Name=progressBar VerticalAlignment=Top
Height=24 Margin=23,39,26,0 />
</Grid>
</UserControl>
DispatcherTimer temporizador;
public Page()
{
InitializeComponent();
temporizador = new DispatcherTimer();
temporizador.Tick += new EventHandler(temporizador_Tick);
temporizador.Interval = TimeSpan.FromSeconds(1);
temporizador.Start();
}
258
07_Silverlight.qxp 9/30/09 1:35 PM Page 259
Manejo de hilos
Thread.Sleep(500);
259
07_Silverlight.qxp 9/30/09 1:35 PM Page 260
7. INTERCONEXIN
Esta lnea detendr el hilo de ejecucin actual durante medio segundo, por lo que,
por cada iteracin del bucle, todo el hilo de ejecucin se detendr. Para este caso, es-
cribimos esa lnea slo para lograr una sensacin de trabajo por parte de la aplicacin
y no cargar en forma instantnea la barra de progreso. En todo caso, el problema per-
siste ya que seguiremos bloqueando el hilo principal de ejecucin, a menos que eje-
cutemos esta funcin en un hilo diferente, como vemos en el siguiente cdigo:
Como primer paso, creamos un delegado del tipo ThreadStart, el cual recibe como
parmetro el nombre de la funcin o mtodo que queramos ejecutar de manera asn-
crona. El siguiente paso consiste en crear un nuevo hilo de ejecucin mediante el uso
de la clase Thread y asignarle al parmetro requerido el delegado creado previamen-
te. Hasta este punto, slo hemos creado el ambiente de ejecucin del nuevo hilo, por
lo que usaremos el mtodo Start() para iniciar el proceso.
Si ejecutamos el nuevo proceso tal como lo hemos escrito, veremos que obtendremos
un error en la ejecucin. Esto se debe a que no es posible, en Silverlight, modificar
elementos de manera directa entre diferentes procesos. Pensemos que la interfaz vi-
sual se est ejecutando en un hilo, como ya hemos podido comprobar, y la funcin,
ahora, se ejecuta en otro hilo, por lo que estos dos hilos de ejecucin no pueden al-
terarse entre ellos. Para poder hacerlo, es necesario dejar que el manejador del hilo
principal se encargue de hacer las actualizaciones correspondientes a los elementos
que pertenezcan a su dominio o estn bajo l.
this.Dispatcher.BeginInvoke((ThreadStart)delegate()
{
this.progressBar.Value = (double)valor;
}
);
El cdigo le avisa, al manejador del hilo, que debe ejecutar la actualizacin de la barra
de progreso. Para esto, utilizamos otro delegado para crear un mtodo annimo, el cual
ejecutar la actualizacin del control cuando el hilo principal pueda procesarlo.
260
07_Silverlight.qxp 9/30/09 1:35 PM Page 261
Manejo de hilos
Hilos y eventos
Podemos llegar an ms lejos con Silverlight y el uso de hilos de ejecucin si im-
plementamos eventos. Si bien ya estamos familiarizados con los eventos debido
a que hemos hecho uso de ellos con la implementacin de botones, listas des-
plegables y otros controles con la capacidad de notificarnos el momento en que
se produce un cambio interno en el control o cuando el usuario interacta con
l, tambin es posible crear estos eventos por nuestra cuenta. Esto puede ser es-
pecialmente til si lo conjugamos con el uso de hilos. De esta forma, podramos
iniciar un hilo de ejecucin para una tarea y hacer que sta, al finalizar o al su-
ceder diferentes hitos, nos avise de estos hechos para que el cdigo que hubiera
iniciado el nuevo proceso sepa cmo reaccionar basado en estos cambios. Pode-
mos declarar un evento de la siguiente forma:
public Page()
RRR DELEGADOS
261
07_Silverlight.qxp 9/30/09 1:35 PM Page 262
7. INTERCONEXIN
{
InitializeComponent();
eventoHilo += new delegadoEvento(Page_eventoHilo);
}
void Page_eventoHilo(int valor)
{
this.Dispatcher.BeginInvoke((ThreadStart)delegate()
{
this.progressBar.Value = (double)valor;
}
);
}
Veamos que concatenamos al evento un delegado que apunta a una funcin creada
por nosotros y que contiene la actualizacin de la barra de progreso. Por ltimo, la
funcin que incluye la iteracin es modificada para que dispare este evento.
Los eventos suelen ser una gran ayuda en implementaciones complejas. De cualquier
manera, es necesario tener cuidado cuando trabajemos con eventos, ya que pueden
arrojarnos un error si ninguna funcin o mtodo se suscribi. Esto quiere decir que,
mientras nadie se suscriba al evento, ste ser nulo y, cuando intentemos ejecutarlo, ob-
tendremos un error de referencia no inicializada. Para solucionar este problema, es re-
comendable usar el cdigo que aparece debajo. As, podremos garantizar que si nadie
se ha suscrito al evento, ste no se disparar y, por ende, no obtendremos un error.
if (eventoHilo != null)
{
eventoHilo(i);
}
262
07_Silverlight.qxp 9/30/09 1:35 PM Page 263
263
07_Silverlight.qxp 9/30/09 1:35 PM Page 264
7. INTERCONEXIN
Si no hemos trabajado nunca con servicios web creados con Microsoft .Net, notare-
mos que no existe diferencia alguna con un mtodo o funcin tradicional del lengua-
je que estemos acostumbrados a usar. De cualquier manera, este mtodo es decorado
con algunos atributos que especifican su alcance, como podemos ver a continuacin:
[WebService(Namespace = http://tempuri.org/)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class MiServicioWeb : System.Web.Services.WebService
{
[WebMethod]
public long Sumar(long valor1, long valor2)
{
return valor1 + valor2;
}
}
264
07_Silverlight.qxp 9/30/09 1:35 PM Page 265
queda expuesto a las distintas aplicaciones que quieran consumirlo. Para poder
consumir un servicio web, primero necesitaremos saber dnde se encuentra, en la
Web, ese servicio. Sin esta ruta, no podremos acceder a l. En el caso del servicio
web creado previamente, si estamos trabajando de manera local, es posible ver su
direccin al ejecutar el servicio. Por lo general, podremos encontrarlo con el apar-
tado http://localhost que hace referencia a nuestro equipo. El siguiente paso es el
de adicionar esta referencia al servicio dentro de nuestra aplicacin Silverlight. Pa-
ra esto, agregaremos una nueva referencia web apuntando al servicio en cuestin,
como vemos en la siguiente figura.
Figura 24. Agregando una referencia de un servicio web a nuestra aplicacin Silverlight.
Entre los protocolos de comunicacin usados por los servicios web, se encuentra el
llamado SOAP (Simple Object Access Protocol, o en castellano, protocolo de acceso
a objetos simple). Este protocolo sirve para transportar objetos de forma simple en-
tre aplicaciones. Adems, se basa en XML para representar los distintos elementos
que se transportarn y, si bien no es el objetivo de este libro profundizar en este pro-
tocolo, s es necesario mencionar que, en el caso de Silverlight, usaremos SOAP pa-
ra transportar la informacin entre nuestra aplicacin y el servicio web. Una vez
, THREAD.SLEEP()
265
07_Silverlight.qxp 9/30/09 1:35 PM Page 266
7. INTERCONEXIN
<UserControl x:Class=Capitulo7ServiciosWeb.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300
xmlns:d=http://schemas.microsoft.com/expression/blend/2008
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
mc:Ignorable=d>
<Grid x:Name=LayoutRoot Background=White>
<Button Click=Button_Click Margin=167,30,190,0
VerticalAlignment=Top Content=Sumar d:LayoutOverrides=Width/>
<TextBox HorizontalAlignment=Left Margin=8,28,0,0
VerticalAlignment=Top Width=69 Text= TextWrapping=Wrap
x:Name=valor1/>
<TextBox HorizontalAlignment=Left Margin=94,28,0,0
VerticalAlignment=Top Width=69 Text= TextWrapping=Wrap
x:Name=valor2/>
<TextBlock x:Name=resultado HorizontalAlignment=Left
Margin=8,69,0,0 VerticalAlignment=Top Text=Resultado:
TextWrapping=Wrap Width=155/>
<TextBlock HorizontalAlignment=Left Margin=8,8,0,0
VerticalAlignment=Top Width=177 Text=Escriba los nmeros a
sumar: TextWrapping=Wrap/>
</Grid>
</UserControl>
266
07_Silverlight.qxp 9/30/09 1:35 PM Page 267
El siguiente paso consiste en tomar los valores introducidos por el usuario, conec-
tarse al servicio web y entregarle estos valores.
servicio.SumarCompleted +=
new EventHandler<ServicioSumar.SumarCompletedEventArgs>
(servicio_SumarCompleted);
servicio.SumarAsync(long.Parse(this.valor1.Text),
long.Parse(this.valor2.Text));
}
Como podemos ver, deberemos realizar tres pasos para poder trabajar con el servicio
web. Primero, crearemos una instancia del servicio ya adicionado como referencia web
a nuestro proyecto. Luego, enlazamos un mtodo o funcin al evento Completed del
mtodo por ejecutar. Esto es debido a que necesitamos llamar de forma asncrona al
servicio web, y este evento nos avisar cuando la llamada se haya completado. Por l-
timo, ejecutamos el evento del servicio pasando los dos valores introducidos por el
usuario. Una vez que el servicio haya realizado de manera correcta el proceso de su-
ma, nos retornar el resultado para que podamos desplegarlo en nuestra aplicacin.
Debido a que los datos transferidos por un servicio web son, tpicamente, XML, puede resultar
difcil probar el servicio sin tener que realizar cdigo. Por esto, Microsoft .Net nos provee de una
interfaz web para probar el servicio. Para acceder a ella, slo tendremos que navegar hasta el
servicio de forma local.
267
07_Silverlight.qxp 9/30/09 1:35 PM Page 268
7. INTERCONEXIN
El objeto e contiene los resultados devueltos por el servicio, por lo que tomamos
de ste la respuesta enviada por el servicio llamado previamente.
Esta clase representar los datos de un usuario que trataremos de enviar a la aplica-
cin Silverlight desde el servicio web. Para esto, tendremos que agregar un nuevo
mtodo web que retorne dicha entidad, como vemos a continuacin:
268
07_Silverlight.qxp 9/30/09 1:35 PM Page 269
[WebMethod]
public Usuarios LeerUsuario()
{
return new Usuarios() { Nombre = Usuario 1,
Apellido = Apellido 1,
Correo = Correo 1 };
}
servicio.LeerUsuarioCompleted +=
new
EventHandler<ServicioSumar.LeerUsuarioCompletedEventArgs>
(servicio_LeerUsuarioCompleted);
servicio.LeerUsuarioAsync();
}
this.grilla.ItemsSource = usuarios;
}
269
07_Silverlight.qxp 9/30/09 1:35 PM Page 270
7. INTERCONEXIN
Si hacemos uso de las ltimas tecnologas propuestas por Microsoft, vale mencio-
nar que Silverlight no slo puede consumir informacin de servicios web clsicos,
sino que tambin puede conectarse y consumir informacin de servicios WCF
(Windows Communication Foundation). Esta tecnologa permite inicializar y hos-
pedar servicios sin la necesidad de contar con un servidor que contenga IIS
(Internet Information Services) para administrar el servicio, como pasara en el
caso de los primeros servicios web creados en este captulo.
ServiceContract: este contrato de servicio, distingue la clase que ser expuesta co-
mo un servicio. Esta clase puede contener diferentes mtodos expuestos.
OperationContract: los contratos de operacin representan cada uno de los mto-
dos o funciones expuestos por el servicio y con los cuales se podr interactuar.
[ServiceContract(Namespace = )]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
270
07_Silverlight.qxp 9/30/09 1:35 PM Page 271
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name=Capitulo7WCFService.Web.ServicioWCFBehavior>
<serviceMetadata httpGetEnabled=true />
<serviceDebug includeExceptionDetailInFaults=false />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled=true />
<services>
<service
behaviorConfiguration=Capitulo7WCFService.Web.ServicioWCFBehavior
name=Capitulo7WCFService.Web.ServicioWCF>
<endpoint address= binding=basicHttpBinding
contract=Capitulo7WCFService.Web.ServicioWCF />
<endpoint address=mex binding=mexHttpBinding
contract=IMetadataExchange />
</service>
</services>
</system.serviceModel>
271
07_Silverlight.qxp 9/30/09 1:35 PM Page 272
7. INTERCONEXIN
[ServiceContract(Namespace = )]
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Allowed)]
En este caso, todos los mensajes que reciba el servicio sern escritos en la consola de
depuracin. De esta forma, comprobaremos que la conexin es exitosa y que los
mensajes estn siendo recibidos por el servicio. Podremos verificar previamente que
el servicio se encuentra activo, ejecutando la aplicacin web y accediendo a la ruta
donde ese servicio se encuentra alojado, como podemos ver en la Figura 27.
272
07_Silverlight.qxp 9/30/09 1:35 PM Page 273
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name=BasicHttpBinding_ServicioWCF
maxBufferSize=2147483647
maxReceivedMessageSize=2147483647>
<security mode=None />
Un mtodo annimo es una pieza de cdigo que no posee una firma (nombre de funcin) especfi-
ca. Todo el cdigo generado para este mtodo es apuntado por un delegado, el cual representar
el punto de entrada para la ejecucin de las lneas creadas dentro de ese mtodo annimo.
273
07_Silverlight.qxp 9/30/09 1:35 PM Page 274
7. INTERCONEXIN
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address=http://localhost:2113/ServicioWCF.svc
binding=basicHttpBinding
bindingConfiguration=BasicHttpBinding_ServicioWCF
contract=ServicioWCF.ServicioWCF
name=BasicHttpBinding_ServicioWCF />
</client>
</system.serviceModel>
</configuration>
Cuando ya tenemos todos los elementos configurados, slo nos resta llamar al
servicio pasndole los parmetros definidos por ste. Notaremos que la forma de
hacerlo es idntica a la que ya hemos usado.
servicio.EscribirMensajeCompleted +=
new
EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(servicio_
EscribirMensajeCompleted);
servicio.EscribirMensajeAsync(this.textoMensaje.Text);
}
Si ejecutamos nuestra aplicacin Silverlight, podremos ver con claridad cmo los
valores escritos en sta son enviados al servicio para que, por ltimo, sean escri-
tos en la consola de depuracin, como vemos en la siguiente imagen.
274
07_Silverlight.qxp 9/30/09 1:35 PM Page 275
Manipular datos
De esta forma, hemos podido conectarnos tanto a servicios web tradicionales como
al nuevo modelo de comunicacin de Microsoft: Windows Communication
Foundation. El acceso y manipulacin de servicios puede sernos de extrema ayuda
en los casos en que necesitemos extender la funcionalidad de Silverlight o inter-
conectarlo con aplicaciones y lenguajes que no estn directamente relacionados
a tecnologas Microsoft. Pensemos en la posibilidad de conectarnos a servicios
creados en lenguajes, como PHP, Java o Ruby, que trabajen en ambientes no re-
lacionados en forma directa con productos Microsoft, como Windows.
MANIPULAR DATOS
En el desarrollo de aplicaciones empresariales, uno de los puntos fuertes es la ma-
nipulacin de datos. Cmo capturar y mostrar informacin desde el usuario y hacia
l, y almacenarla o recuperarla, son algunos de los retos con los que los desarrolla-
dores se enfrentan a cada momento. Por esto, es necesario tambin poder contar
con formas fciles y rpidas de realizar estas tareas. Silverlight implementa varas tc-
nicas y modelos que simplifican el desarrollo de aplicaciones orientadas a los datos.
Por un lado, podemos usar el concepto de enlazado de datos, que hace referencia
a que, sobre la base de los datos que tengamos disponibles y de su estructura, po-
damos especificar qu controles y componentes los mostrarn y cmo lo harn, as
como actualizar esta informacin de vuelta hacia los elementos que originalmente
transportaban esta informacin. Otra de las posibilidades brindadas es el uso de
275
07_Silverlight.qxp 9/30/09 1:35 PM Page 276
7. INTERCONEXIN
Enlazado de datos
Esta tcnica, entonces, se refiere a la posibilidad de que los valores contenidos en
una entidad contenedora de datos puedan ser ledos y mostrados de manera auto-
mtica. Decimos que es de forma automtica ya que, en los casos ms comunes, se
suele leer el valor del origen de datos y asignarlo al elemento de la interfaz que
queramos que muestre esta informacin.
this.textBoxNombre.Text = persona.Nombre;
this.textBoxApellido.Text = persona.Apellido;
this.textBoxCorreo.Text = persona.Correo;
Si bien las lneas de cdigo vistas no representan un problema, con grandes volme-
nes de informacin pueden requerir mucho esfuerzo para su construccin. Adems,
pueden incurrir en costos de mantenimiento. Si agregramos o modificramos algu-
na de las propiedades del objeto contenedor de datos, tendramos que cambiar tam-
bin nuestro cdigo. Al mismo tiempo, si necesitramos hacer que uno de los valores
anteriores se mostrase en otra caja de texto y no en la predefinida en el cdigo, sera
necesario tener que modificar esas lneas y compilar la aplicacin otra vez. Para solu-
cionar este problema y asociar los datos a los distintos controles de nuestra interfaz,
podemos utilizar el enlazado de datos en el cdigo XAML, especificando el nombre
de la propiedad del contenedor de datos del cual tomaremos la informacin:
Text={Binding Correo}
276
07_Silverlight.qxp 9/30/09 1:35 PM Page 277
Manipular datos
<UserControl x:Class=Capitulo7DataBinding.Page
xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation
xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml
Width=400 Height=300
xmlns:d=http://schemas.microsoft.com/expression/blend/2008
xmlns:mc=http://schemas.openxmlformats.org/markup-compatibility/2006
mc:Ignorable=d>
<Grid x:Name=LayoutRoot Background=White>
<Grid.RowDefinitions>
<RowDefinition Height=0.177*/>
<RowDefinition Height=0.187*/>
<RowDefinition Height=0.21*/>
<RowDefinition Height=0.427*/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=0.315*/>
<ColumnDefinition Width=0.685*/>
</Grid.ColumnDefinitions>
<TextBox Margin=8,31,82,8 Grid.Column=1 Grid.Row=2
Text={Binding Correo} TextWrapping=Wrap
d:LayoutOverrides=Height/>
<TextBox Margin=8,24,82,8 Grid.Column=1 Grid.Row=1
Text={Binding Apellido} TextWrapping=Wrap
d:LayoutOverrides=Height/>
<TextBox Margin=8,21,82,8 Grid.Column=1 Text={Binding Nombre}
TextWrapping=Wrap d:LayoutOverrides=Height/>
<Button Click=Button_Click HorizontalAlignment=Left
Margin=8,0,0,8 VerticalAlignment=Bottom Grid.Column=1
Grid.Row=3 Content=Leer d:LayoutOverrides=Height/>
<Button Click=Button_Click_1 HorizontalAlignment=Left
Margin=42,0,0,8 VerticalAlignment=Bottom Grid.Column=1
Grid.Row=3 Content=Guardar/>
<TextBlock Margin=62.594,0,8.161,8 VerticalAlignment=Bottom
Text=Nombre: TextWrapping=Wrap d:LayoutOverrides=Height/>
<TextBlock Margin=62.594,0,8.161,8 VerticalAlignment=Bottom
Grid.Row=1 Text=Apellido: TextWrapping=Wrap
d:LayoutOverrides=Height/>
<TextBlock HorizontalAlignment=Right Margin=0,0,7.717,8
VerticalAlignment=Bottom Width=55 Grid.Row=2 Text=Correo:
TextWrapping=Wrap d:LayoutOverrides=Height/>
277
07_Silverlight.qxp 9/30/09 1:35 PM Page 278
7. INTERCONEXIN
</Grid>
</UserControl>
public Page()
{
InitializeComponent();
RRR DATACONTEXT
278
07_Silverlight.qxp 9/30/09 1:35 PM Page 279
Manipular datos
persona = (Persona)this.LayoutRoot.DataContext;
279
07_Silverlight.qxp 9/30/09 1:35 PM Page 280
7. INTERCONEXIN
Esto se debe a que es posible especificar la forma en la que los controles con datos en-
lazados se comportarn ante los cambios. Configuramos el enlace de datos con alguna
de las siguientes propiedades basados en el comportamiento que queramos obtener:
OneWay: ste es el valor por defecto. Har que el control enlazado modifique su
valor slo cuando la fuente de datos sea modificada.
TwoWay: actuar tanto cuando la fuente de datos sea modificada as como cuan-
do el control sufra un cambio. De esta forma, si el usuario modificara el texto des-
plegado en un control, este cambio se vera reflejado en la fuente de datos.
OneTime: slo actualizar los controles la primera vez que se asignen los valores
desde la fuente de datos. Luego, no se vern afectados por cambios en la fuente
de datos y tampoco ejercern cambios sobre ella.
280
07_Silverlight.qxp 9/30/09 1:35 PM Page 281
Manipular datos
En el ejemplo anterior hemos usado, como tipo de dato base para todos los valo-
res, un string o texto, pero esto no siempre ser de esta manera, ya que a veces se
necesitan otro tipo de valores para albergar, por ejemplo, datos numricos, fechas
y dems. Si enlazramos datos diferentes al de texto y el usuario introdujera un va-
lor no soportado por ese tipo de datos, por ejemplo, un campo numrico para alo-
jar el precio de un producto, y el usuario escribiera una letra, obtendramos un
error en la aplicacin. Esto se debe a que, al tratar de pasar los valores de la inter-
faz a la entidad asignada, los tipos de datos colapsaran. Para evitar esto, podemos
hacer uso de validadores en el enlazado de datos que, si bien no prevendrn del
error, s nos avisarn para que nosotros tomemos un curso de accin para solucio-
narlo. Tengamos en cuenta la siguiente entidad de datos:
Veamos que, en la propiedad Text del control, dentro de la declaracin del en-
lazado de datos previamente usada, ahora hemos agregado dos nuevos atributos:
281
07_Silverlight.qxp 9/30/09 1:35 PM Page 282
7. INTERCONEXIN
282
07_Silverlight.qxp 9/30/09 1:35 PM Page 283
Manipular datos
LinQ
LinQ es una modificacin a los lenguajes de programacin basados en Microsoft .Net
Framework 3.5, que permite realizar consultas sobre XML, objetos y bases de datos
simulando la sintaxis de SQL transaccional con palabras reservadas y un enfoque orien-
tado a objetos. Es destacable la presencia de LinQ en Silverlight ya que, por el peque-
o tamao de la firma instalable en el navegador del cliente, sera vlido asumir que
slo contendr funcionalidad mnima y que no podra incluir este tipo de aditamen-
tos. Contar con esta clase de herramientas que pueden maximizar la productividad en
el desarrollo hace que, una vez ms, Silverlight est listo para aplicaciones de gran escala.
Para ver la potencia de LinQ, asumamos que necesitamos ordenar una lista de ele-
mentos en un vector. Si bien contamos con mecanismos propios de .Net Framework,
podra existir la posibilidad de que tengamos que implementar nuestra propia forma
de ordenamiento. Una de las ms conocidas es el ordenamiento de burbuja.
ultimo_cambio = i;
}
}
maximo_derecho = ultimo_cambio;
}
while (maximo_derecho > 0);
}
La funcin antes planteada ordenar un vector de enteros, que tendr como nica
tarea posible realizar este trabajo. Ahora veamos lo que podramos lograr con LinQ:
283
07_Silverlight.qxp 9/30/09 1:35 PM Page 284
7. INTERCONEXIN
Si tenemos el mismo vector de nmeros enteros, slo ejecutamos una consulta sobre
ese vector, ordenndolo de manera ascendente y asignndolo a un control ListBox. Co-
mo podemos ver, para lograr el mismo resultado, la cantidad de cdigo comparado con
el ordenamiento por burbuja tpico es sustancialmente menor y ms fcil de entender.
Pero LinQ puede ir mucho ms lejos y no slo ordenar vectores simples. Teniendo
en cuenta que, a pesar de la reduccin del volumen de cdigo, la lgica para orde-
nar el vector suele ser genrica, LinQ provee otras caractersticas sobre una coleccin
de elementos o de objetos. Podramos tener un tipo complejo como el que sigue:
284
07_Silverlight.qxp 9/30/09 1:35 PM Page 285
Manipular datos
{
A,
B,
C
}
Esta entidad posee diferentes elementos complejos como para invalidar el uso del
ordenamiento por burbuja que habamos visto inicialmente, sin tener que modi-
ficarlo casi por completo. De cualquier manera, con LinQ podramos solucionar
este problema de forma sencilla.
En este caso, de una lista de la entidad Estudiante, seleccionamos slo los alumnos
pertenecientes al curso A con una nota superior a 4, y ordenamos el resultado
285
07_Silverlight.qxp 9/30/09 1:35 PM Page 286
7. INTERCONEXIN
286
07_Silverlight.qxp 9/30/09 1:35 PM Page 287
Manipular datos
Estos operadores pueden ser aplicados a cualquier lista de objetos o a cualquier ele-
mento que soporte la interfaz IEnumerable<>. Los resultados obtenidos con LinQ
pueden ser moldeables. Con esto queremos decir que no es necesario que, tras
cada consulta, retornemos un nuevo conjunto de elementos de la misma entidad
filtrada. Es posible, con LinQ, retornar slo los campos de la entidad que necesite-
mos para ese momento, como podemos ver en el siguiente ejemplo:
this.grillaAlumnos.ItemsSource = q;
}
En el ejemplo anterior, el resultado slo contendr los nombres y las materias de los
estudiantes que cumplan con el criterio de bsqueda, pero no se incluirn los de-
ms elementos de la entidad. LinQ tiene mucho potencial, por lo que no debere-
mos desestimarlo en nuestros desarrollos. Si bien aqu slo hemos visto la punta de
lo que LinQ tiene para ofrecernos, a medida que lo pongamos en prctica recono-
ceremos que podemos lograr cosas bastante complejas con muy poco cdigo.
RESUMEN
Este captulo nos ha terminado de mostrar la potencia de Silverlight cuando le agregamos c-
digo C#. Hemos modificado el estado de los controles y componentes para que se comporten
de distintas formas desde el cdigo, aprendimos a guardar y a leer informacin del usuario,
enviamos y recibimos informacin por medio de la red con un lector RSS, y utilizamos tecno-
logas de conexin y transporte de datos para consumir informacin distante. As, Silverlight
orientado a animaciones y comportamiento visual se transforma en un Silverlight para el de-
sarrollo de aplicaciones web de alto nivel.
287
07_Silverlight.qxp 9/30/09 1:35 PM Page 288
ACTIVIDADES
288
08_Silverlight.qxp 9/30/09 1:36 PM Page 289
Silverlight Captulo 8
El navegador
y su dominio
El navegador web es el centro neurlgico
de ejecucin de Silverlight,
8. EL NAVEGADOR Y SU DOMINIO
CONECTAR TECNOLOGAS
En el entorno del navegador web, trabajan diferentes tecnologas y lenguajes. Por
ejemplo JavaScript, un lenguaje interpretado y ejecutado por el navegador que faci-
lita desde la generacin de contenido dinmico hasta validaciones de las entradas del
usuario. Junto con JavaScript, podemos encontrar el lenguaje de etiquetas que da vi-
da a la Web, el HTML, as como otras tecnologas tales como las hojas de estilo o el
uso de XML. Todo esto es administrado por el navegador del usuario cada vez que
ste accede y visualiza una pgina web. Por supuesto, Silverlight tambin es parte de
este entorno, ya que trabaja dentro del navegador del cliente y convive con las tecno-
logas antes mencionadas. El hecho de que Silverlight conviva con otras tecnologas
web hace que sea natural encontrarse con la posibilidad de que este software pueda
influir e interactuar con ellas, as como stas podran, tambin, modificar el compor-
tamiento de la aplicacin Silverlight creada y hospedada en este entorno comn. As
es cmo Silverlight provee una serie de objetos que nos permiten interactuar con nues-
tras pginas web, desde dentro de la aplicacin Silverlight, y al mismo tiempo, su in-
trprete, instalado en el navegador cliente y que hace uso del lenguaje JavaScript, per-
mite crear y modificar aplicaciones Silverlight desde fuera de su contenedor. En este
captulo veremos, entonces, cmo es posible interactuar con Silverlight desde fuera de
l y cmo ste, a su vez, puede modificar el ambiente que lo contiene.
SILVERLIGHT 2 Y EL HTML
Silverlight posee una serie de objetos, clases y componentes que nos permiten in-
teractuar con el entorno donde est contenido. En este caso especfico, con el
HTML de la pgina web que contiene nuestra aplicacin web. Si tenemos en cuen-
ta que la aplicacin Silverlight creada se declara en el cdigo HTML por medio de
tags que el navegador entienda, entonces la aplicacin es un elemento ms de to-
do el conjunto de elementos que representan la pgina web. Si vemos el cdigo
HTML declarativo usado para incrustar aplicaciones Silverlight en HTML, nos
daremos cuenta de que este elemento es uno ms en el conjunto de tags.
<div id=silverlightControlHost>
<object data=data:application/x-silverlight-2, type=application/x-
silverlight-2 width=100% height=100%>
<param name=source value=ClientBin/Capitulo8HTML.xap/>
<param name=onerror value=onSilverlightError />
<param name=background value=white />
290
08_Silverlight.qxp 9/30/09 1:36 PM Page 291
Silverlight 2 y el HTML
El cdigo anterior nos muestra que, para que el navegador web pueda mostrar y eje-
cutar la aplicacin Silverlight, sta debe ser declarada en el lenguaje que el navega-
dor entienda, esto es, HTML, y, por consiguiente, ser posible acceder a este HTML
desde la aplicacin Silverlight. A continuacin, podemos ver la lista de clases y ob-
jetos disponibles desde Silverlight para interactuar con nuestra pgina HTML.
HtmlPage: identifica la pgina HTML actual. Segn dnde est incrustado el control
Silverlight, su contexto HTML es representado por este objeto. Este objeto provee
las principales funcionalidades para interactuar con la pgina web actual, como cap-
turar informacin del navegador en el que est corriendo la aplicacin, abrir venta-
nas emergentes, conocer configuraciones de seguridad del navegador, entre otras.
BrowserInformation: retorna informacin especfica del navegador, como el tipo de
navegador que se est usando, el nombre del navegador web, su versin, etctera.
HtmlDocument: representa la pgina HTML, su estructura y tags. HtmlDocument
puede ser til en momentos en los que necesitemos modificar los elementos con-
tenidos en nuestra pgina web.
HtmlElement: puede ser cualquier elemento HTML contenido en la pgina web.
Se pueden usar mtodos como SetAttribute() y SetProperty() para modificar cada
elemento, pasando u obteniendo valores al elemento y desde l.
HtmlWindow: representa la ventana del navegador, proporcionando mtodos para na-
vegar a otras pginas o saltar entre diferentes marcadores dentro de la misma pgina.
HttpUtility: nos otorga un conjunto de herramientas de cdigo para realizar tare-
as sobre el HTML. Codificar y decodificar los parmetros enviados desde la p-
gina original hacia una pgina destino.
ScriptableTypeAttribute/ScriptableMemberAttribute: atributos que pueden ser aplica-
dos a nuestras clases en Silverlight para hacerlas accesibles desde cdigo JavaScript.
ScriptObject: referencia una funcin JavaScript escrita y ejecutada en la pgina web
contenedora de la aplicacin Silverlight. Esta referencia puede ser ejecutada desde
nuestra aplicacin Silverlight para realizar acciones fuera del contexto de Silverlight.
291
08_Silverlight.qxp 9/30/09 1:36 PM Page 292
8. EL NAVEGADOR Y SU DOMINIO
HtmlDocument y HtmlElement
Con HtmlDocument es posible modificar e interactuar con la estructura HTML pre-
sente en el documento que albergue la aplicacin Silverlight. El siguiente cdigo lee la
direccin web desde el navegador y la muestra dentro de nuestra aplicacin Silverlight:
HtmlDocument no slo nos otorga algunos datos del navegador y la pgina web en
la cual estemos ejecutando nuestra aplicacin, tambin nos permite acceder a los
elementos que estn fuera de nuestra aplicacin. Veamos el siguiente cdigo HTML:
292
08_Silverlight.qxp 9/30/09 1:36 PM Page 293
Silverlight 2 y el HTML
<tr>
<td style=width:500px; height:300px;>
<asp:Silverlight ID=Xaml1 runat=server
Source=~/ClientBin/Capitulo8HTML.xap
MinimumVersion=2.0.31005.0 Width=100%
Height=100% />
</td>
</tr>
<tr>
<td>
<input type=text id=textBoxExterno value= />
</td>
</tr>
</table>
</div>
</form>
</body>
Como podemos observar en el cdigo HTML que aparece ms arriba, nuestra apli-
cacin Silverlight se encuentra dentro de una tabla HTML y, en el fondo de ella,
un campo de texto declarado con tags HTML.
293
08_Silverlight.qxp 9/30/09 1:36 PM Page 294
8. EL NAVEGADOR Y SU DOMINIO
294
08_Silverlight.qxp 9/30/09 1:36 PM Page 295
Silverlight 2 y el HTML
Figura 4. En este caso, la caja de texto HTML fue modificada desde Silverlight.
Pero este tipo de atributos no slo sirve para modificar o leer valores de los con-
troles HTML de la pgina web. El comportamiento, por el contrario, es ms cer-
cano al que podra brindar JavaScript, ya que muchas propiedades no comunes
en el tag HTML, pero que s pueden ser accedidas desde JavaScript, tambin
pueden ser accedidas y modificadas desde Silverlight. Agreguemos una fila ms
a la tabla HTML previamente creada.
<tr>
<td>
<div id=constructorHTML>
</div>
</td>
</tr>
Como vemos, hemos agregado una etiqueta <div>. Esta etiqueta tiene la particula-
ridad de servir de contenedor de otras etiquetas HTML y, como tal, tambin es po-
sible modificar su estructura HTML desde cdigo JavaScript mediante el uso de la
propiedad innerHTML. Entonces, podramos hacer uso de innerHTML desde la apli-
cacin Silverlight para crear cdigo HTML dentro de esta etiqueta.
295
08_Silverlight.qxp 9/30/09 1:36 PM Page 296
8. EL NAVEGADOR Y SU DOMINIO
{
HtmlDocument documento = HtmlPage.Document;
string constructor = Introducir nombre: <input type=\text\
value=\\ id=\nuevoTexto\ style=\width:150px\>;
documento.GetElementById(constructorHTML).SetAttribute(innerHTML,
constructor);
}
Como vemos en el cdigo, construimos elementos HTML sobre la base de una ca-
dena de texto que luego es asignado al atributo innerHTML del tag <div>, haciendo
que este texto sea transformado en HTML.
Figura 5. La nueva caja de texto, con un texto descriptivo creado desde Silverlight.
Como este elemento es creado dentro del conjunto de elementos HTML que con-
forman la pgina web, no sera impedimento, mediante el uso de GetAttribute y el
identificador del nuevo control, para recuperar esta informacin una vez que el usua-
rio hubiera completado el campo de texto.
En caso de que tengamos que realizar una aplicacin que no slo trabaje con navega-
dores de la gama de Internet Explorer, podemos hacer uso de otros mecanismos para
crear controles de manera dinmica. Por ejemplo, mediante el uso de HtmlElement, ob-
jeto que permite la manipulacin de elementos individuales dentro de la pgina HTML.
296
08_Silverlight.qxp 9/30/09 1:36 PM Page 297
Silverlight 2 y el HTML
Veamos que, en el caso anterior, es necesario definir cada uno de los atributos que
representarn el objeto HTML por crear. Inicialmente creamos un elemento de un
tipo especfico, un tipo INPUT, tag usado, por lo comn, para definir elementos
con los cuales el usuario pueda interactuar. El siguiente paso es definir el tipo de con-
trol contemplado dentro de este tag y, por ltimo, definimos un valor por defecto
que se visualizar, al comienzo, cuando el control se cree en la pgina web. Por
ltimo, adicionamos este nuevo control a la lista de controles hijo del tag <div>
con el que antes habamos estado interactuando.
297
08_Silverlight.qxp 9/30/09 1:36 PM Page 298
8. EL NAVEGADOR Y SU DOMINIO
298
08_Silverlight.qxp 9/30/09 1:36 PM Page 299
Silverlight 2 y el HTML
Todos los elementos contenidos dentro de las etiquetas <form> son capturados por
la pgina y enviados al servidor para su procesamiento. As, un usuario que hubie-
se interactuado con cajas de texto, listas desplegables y otros controles podra no-
tificar de estos cambios al cdigo que se ejecuta en el servidor. En el caso de
ASP.net, es posible analizar estos elementos desde el cdigo creado en el servidor.
Ese cdigo podra ser como el que sigue:
<script runat=server>
</script>
, INNERHTML
La propiedad innerHTML slo es vlida en navegadores compatibles con Internet Explorer,
debido a que Microsoft agreg esta funcionalidad al conjunto de sentencias disponibles para
JavaScript bajo Internet Explorer. Si usamos innerHTML para nuestros desarrollos, podramos
obtener un error en tiempo de ejecucin si el usuario utilizase un navegador no compatible.
299
08_Silverlight.qxp 9/30/09 1:36 PM Page 300
8. EL NAVEGADOR Y SU DOMINIO
HtmlPage
El objeto HtmlPage tambin provee una serie de mtodos y funciones para interactuar
sobre la pgina web donde Silverlight reside. Si bien hemos utilizado este objeto para
obtener una referencia al documento que representa el HTML de la pgina, HtmlPage
se encuentra en un nivel superior y representa toda la informacin de la pgina en
s, pudiendo generar comportamientos en el navegador. Uno de ellos est ligado a la
creacin de ventanas emergentes. Las ventanas emergentes son aquellas que, al ingre-
sar en un sitio o por medio de alguna accin del usuario, son disparadas en una nueva
instancia del navegador web, apareciendo una segunda ventana que nos redirige a otra
300
08_Silverlight.qxp 9/30/09 1:36 PM Page 301
Silverlight 2 y el HTML
</script>
Notaremos que para crear una nueva ventana es necesario, como primer parmetro,
definir la direccin web a la cual navegar esa ventana, un nombre que la identifique
y una serie de parmetros que definirn su comportamiento. Como resultado, obten-
dremos una nueva instancia del navegador, como vemos en la siguiente figura:
Si entendemos este concepto, veremos que la forma de realizar esto desde Silverlight
es similar. Veamos el cdigo:
301
08_Silverlight.qxp 9/30/09 1:36 PM Page 302
8. EL NAVEGADOR Y SU DOMINIO
opciones.Height = 300;
HtmlPage.PopupWindow(new Uri(http://www.redusers.com), _blank,
opciones);
El resultado de este cdigo ser idntico al obtenido con JavaScript, donde tam-
bin deberemos definir una direccin URL, el nombre de la nueva instancia y una
serie de opciones para configurar la ventana emergente. Las opciones de configu-
racin de la ventana emergente pueden ser importantes a la hora de obtener un
comportamiento visual especfico. Podemos ver la lista de opciones dentro del ob-
jeto HtmlPopupWindowOptions a continuacin:
302
08_Silverlight.qxp 9/30/09 1:36 PM Page 303
Silverlight 2 y el HTML
opciones.Status = false;
opciones.Toolbar = false;
opciones.Top = 50;
opciones.Width = 300;
HtmlPage.PopupWindow(new Uri(http://www.redusers.com), _blank,
opciones);
Debido a que las ventanas emergentes suelen ser intrusivas, o no necesariamente acep-
tadas por todos los usuarios, los navegadores actuales cuentan con mecanismos para
bloquear estas ventanas, haciendo que no puedan abrirse a menos que el usuario espe-
cifique lo contrario. Debido a esto, si ejecutamos el cdigo en forma directa y el nave-
gador del cliente cuenta con una herramienta de bloqueo de ventanas emergentes,
no podremos lanzar esta ventana y, por consiguiente, la funcionalidad que pudiramos
haber querido implementar se vera frenada. Para asegurarnos de que esto no pase, o
por lo menos poder avisarle al usuario que necesitar realizar una accin especfica pa-
ra permitir las ventanas emergentes, es posible hacer uso del siguiente cdigo:
if (HtmlPage.IsPopupWindowAllowed)
{
HtmlPopupWindowOptions opciones = new HtmlPopupWindowOptions();
...
...
HtmlPage.PopupWindow(new Uri(http://www.redusers.com), _blank,
opciones); }
303
08_Silverlight.qxp 9/30/09 1:36 PM Page 304
8. EL NAVEGADOR Y SU DOMINIO
else
{
this.mensaje.Text = No se permiten ventanas emergentes.;
}
Cabe mencionar que adems de abrir una ventana emergente dentro de su parmetro
de retorno, HtmlPage.PopupWindow devuelve una referencia del tipo HtmlWindow. Con
esta referencia, es posible modificar el comportamiento de la ventana antes abier-
ta de la misma forma que lo haramos desde cdigo JavaScript. En el siguiente
cdigo de ejemplo, una vez creada la nueva ventana emergente, si el usuario pre-
siona sobre el segundo botn de la aplicacin Silverlight, redirigiremos el conte-
nido de la ventana a otro sitio web.
HtmlWindow window;
304
08_Silverlight.qxp 9/30/09 1:36 PM Page 305
Silverlight 2 y el HTML
HtmlWindow
Para extender lo explicado en el apartado anterior, diremos que HtmlWindow re-
presenta una referencia a una ventana del navegador. sta puede ser una ventana
emergente o la misma ventana principal donde se ejecuta la aplicacin Silverlight.
Adems de poder redirigir la pgina a un nuevo destino, HtmlWindow nos otorga
algunos elementos ms con los cuales trabajar.
305
08_Silverlight.qxp 9/30/09 1:36 PM Page 306
8. EL NAVEGADOR Y SU DOMINIO
Por ejemplo, podramos necesitar requerir informacin por parte del usuario usando
ventanas especficas del navegador y no creando las nuestras dentro de la aplicacin
Silverlight. La ventaja de realizar esto reside en que esos cuadros de dilogo pueden
bloquear el uso de la pgina hasta que el usuario lo cierre. Al bloquear la interaccin
con la pgina, podemos asegurarnos de que el usuario siga el flujo de nuestra aplica-
cin y no evada ciertas reglas necesarias en nuestro cdigo. El siguiente cdigo otor-
ga la posibilidad de enviar una alerta al usuario en forma de cuadro de dilogo.
306
08_Silverlight.qxp 9/30/09 1:36 PM Page 307
Silverlight 2 y el HTML
307
08_Silverlight.qxp 9/30/09 1:36 PM Page 308
8. EL NAVEGADOR Y SU DOMINIO
En este caso, el cuadro de dilogo se mostrar con el mensaje contenido dentro del
mtodo Prompt() y retornar un tipo de dato de texto que contiene la respuesta
del usuario. En la Figura 17, podemos ver el mensaje que se muestra al usuario,
donde podr escribir la respuesta, y en la Figura 18 observamos que la respuesta
es escrita dentro de la aplicacin Silverlight.
En este mismo captulo pudimos abrir una nueva ventana emergente haciendo
uso de PopupWindow(), pero tambin es posible que redirijamos la pgina web
actual hacia otro destino web sin la necesidad de abrir una ventana nueva que
pueda ser bloqueada por el navegador.
308
08_Silverlight.qxp 9/30/09 1:36 PM Page 309
Silverlight 2 y el HTML
ventanaPrincipal.Navigate(new Uri(http://www.bing.com));
}
El texto de los botones del cuadro de dilogo Confirm() depender directamente del idioma del
navegador web que est usando el usuario, as como tambin de su versin y su tipo. No se pue-
de, en ningn caso, modificar por cdigo estos valores.
309
08_Silverlight.qxp 9/30/09 1:36 PM Page 310
8. EL NAVEGADOR Y SU DOMINIO
{
HtmlWindow ventanaPrincipal = HtmlPage.Window;
ventanaPrincipal.Navigate(new Uri(http://www.bing.com), _blank);
}
<a name=MiMarcador>
310
08_Silverlight.qxp 9/30/09 1:36 PM Page 311
Silverlight 2 y el HTML
Podemos extender este ejemplo simple para lograr que, sobre la base de los marcado-
res, podamos cargar diferentes controles Silverlight contenidos en nuestra aplicacin.
Al hacer esto, podemos dar mayor facilidad de uso sobre la aplicacin. Pensemos en
una aplicacin que tenga diferentes estados o pginas internas que se vayan mostran-
do durante la interaccin con el usuario.
El usuario podra querer marcar una pgina especfica de la aplicacin para luego
acceder directamente a esa parte de la aplicacin. Sin embargo, debido a que cada
vez que se carga la aplicacin esto se har desde el inicio, ser difcil saber qu par-
te es la que quiere ver el usuario. Pero, aplicando marcadores a la aplicacin, es po-
sible conseguir esto. Nuestro primer paso ser agregar un nuevo control Silverlight
a la solucin. El siguiente paso ser modificar el cdigo que inicia la aplicacin Sil-
verlight (App.xaml.cs) de la siguiente forma:
311
08_Silverlight.qxp 9/30/09 1:36 PM Page 312
8. EL NAVEGADOR Y SU DOMINIO
else
{
try
{
Type type = this.GetType();
Assembly assembly = type.Assembly;
UserControl controlDestino =
(UserControl)assembly.CreateInstance(
HtmlPage.Window.CurrentBookmark);
controlPrincipal.Children.Add(controlDestino);
}
catch
{
controlPrincipal.Children.Add(new Page());
}
}
}
HtmlPage.Window.CurrentBookmark);
controlPrincipal.Children.Add(controlDestino);
312
08_Silverlight.qxp 9/30/09 1:36 PM Page 313
Silverlight 2 y el HTML
{
App.Navegar(new Pagina2());
}
313
08_Silverlight.qxp 9/30/09 1:36 PM Page 314
8. EL NAVEGADOR Y SU DOMINIO
#Capitulo8HTML3.Pagina2
La segunda parte, despus del punto, se refiere al nombre del control de usuario o
clase que manejar ese control. Deberemos tener en cuenta esto para poder gene-
rar, de manera correcta, la instancia del control que se va a visualizar.
Cookies
Las cookies son archivos de texto que se alojan en el equipo del cliente. Casi siem-
pre, son usados para dejar informacin del usuario para luego reutilizarla segn la
necesidad. Los casos ms comunes de uso de cookies los podemos encontrar en aque-
llos sitios web en los que, al ingresar, nos preguntan si deseamos que nos recuerden,
por ejemplo, nuestro nombre de usuario y contrasea para validar nuestra entidad,
para que no debamos volver a colocarlos la prxima vez que ingresemos. Estos sitios
dejan un archivo de texto con valores y fecha de expiracin en nuestra computado-
ra, que leern posteriormente para as recuperar eso que haban almacenado.
Desde una aplicacin Silverlight es posible, tambin, leer cookies que hayan sido cre-
adas por el sitio web donde sta trabaja o crear estos elementos para el mismo sitio web.
No debemos comparar las cookies con la caracterstica de almacenamiento aislado
provista por Silverlight. Si bien la capacidad de las cookies para almacenar informacin
314
08_Silverlight.qxp 9/30/09 1:36 PM Page 315
Silverlight 2 y el HTML
es limitada, estos elementos se guardan en el equipo del cliente y pueden ser compar-
tidos con otros ambientes de desarrollo. Estas cookies podran ser manipuladas desde
una aplicacin ASP.net, como por JavaScript. Por este motivo, las cookies pueden con-
vertirse en un buen canal de comunicacin entre las distintas plataformas.
En el siguiente ejemplo, crearemos una cookie desde ASP.net, que leeremos y mo-
dificaremos desde Silverlight. Lo primero ser crear la estructura y el cdigo ASP.net.
Aqu creamos dos botones, uno para crear la cookie y el otro para leerla. Los valores
sern desplegados en el campo de texto que se encuentra declarado al final de las l-
neas anteriores. Para crear cookies desde ASP.net, escribiremos el siguiente cdigo:
El primer mtodo crea una cookie llamada CookieSilver, que contiene el valor 1234.
El segundo mtodo lee y escribe el contenido de la cookie en el campo de texto. Una
vez terminado este paso, podremos tomar esta cookie desde Silverlight. En el evento
de presionado del botn, agregaremos el cdigo de lectura y recoleccin de la cookie.
315
08_Silverlight.qxp 9/30/09 1:36 PM Page 316
8. EL NAVEGADOR Y SU DOMINIO
Debido a que podra haber ms de una cookie, cada una de stas se separarn me-
diante el identificador de ; (punto y coma). Adems, las cookies sern almacena-
das con la estructura [Nombre]=[Valor], por lo que, delante del signo igual en-
contraremos el nombre de la cookie y seguido, el valor almacenado. Al ejecutar el
cdigo, obtendremos algo similar a lo siguiente.
316
08_Silverlight.qxp 9/30/09 1:36 PM Page 317
Silverlight 2 y el HTML
Por supuesto, tambin es posible crear o sobrescribir una cookie ya existente desde
una aplicacin Silverlight. Para esto, es necesario utilizar un modelo diferente que
no incluye el uso de HtmlPage.Document.Cookies. En este caso, usaremos SetProperty,
modificando el valor de la propiedad cookie del navegador.
Notemos que, adems del valor de la cookie, tambin es posible especificar una
fecha de expiracin. Esto quiere decir que, si agregamos una fecha a la cookie,
sta se mantendr disponible hasta esa fecha. En caso de no especificar una fecha,
la cookie se eliminar en el momento en el que abandonemos la pgina que la
cre. En la Figura 25, podemos observar que el valor de la cookie modificada des-
de la aplicacin Silverlight tambin es reconocido desde ASP.net.
Modificar CSS
Las hojas de estilo, tambin conocidas como CSS, pueden ser alteradas desde la
aplicacin Silverlight. Debido a que tenemos acceso al modelo de objetos de la
317
08_Silverlight.qxp 9/30/09 1:36 PM Page 318
8. EL NAVEGADOR Y SU DOMINIO
pgina HTML, cualquier elemento presente en sta podra ser cambiado desde
nuestra aplicacin. En el caso del uso de estilos, puede resultar de utilidad cuan-
do necesitemos informar al usuario de algn acontecimiento modificando la ti-
pografa o los colores del elemento. A continuacin, veamos dos estilos creados
en la pgina donde se ejecutar nuestra aplicacin:
<style type=text/css>
.estilo1
{
font-family: Arial;
font-size: larger;
color: Blue;
}
.estilo2
{
font-family: Verdana;
font-size: smaller;
color: Green;
}
</style>
Estos estilos presentan una tipografa especfica para cada uno, as como un tama-
o de letra y un color especial. Apliquemos el primer estilo a un texto en HTML.
En este caso, mediante el uso de class, asignamos el primer estilo a la frase Texto con
estilos.Podemos ver el resultado en la siguiente imagen:
_` DE HTML A CSS
El desarrollo web ha evolucionado tanto a lo largo de los aos que la aplicacin de los formatos vi-
suales a textos, imgenes, colores de fondo, posicin de distintos elementos y otros aspector pa-
s de ser declarado con etiquetas HTML al uso total de las hojas de estilo. Al momento de disear
nuestros sitios web, es una buena prctica aplicar esta tcnica por sobre el uso de tags HTML.
318
08_Silverlight.qxp 9/30/09 1:36 PM Page 319
Silverlight 2 y el HTML
Figura 26. El texto se muestra con las caractersticas del primer estilo creado.
Figura 27. El formato de la frase cambi de acuerdo con el segundo estilo declarado.
319
08_Silverlight.qxp 9/30/09 1:36 PM Page 320
8. EL NAVEGADOR Y SU DOMINIO
Por cada estilo que deseemos aplicar, necesitamos realizar una llamada al mtodo
SetStyleAttribute(), especificando el nombre del estilo y su valor. Observemos, en
la siguiente figura, cmo se visualiza el elemento HTML antes de aplicar un estilo
y cmo queda luego su posterior transformacin.
SILVERLIGHT 2 Y JAVASCRIPT
As como hemos podido interactuar con el HTML contenedor de la aplicacin Silver-
light, tambin es posible hacerlo con el cdigo JavaScript que se ejecuta en el navega-
dor. Esta caracterstica puede resultar muy valiosa si tenemos en cuenta el uso actual
que se le da a la Web y todas las tecnologas involucradas. Por ejemplo, la implemen-
320
08_Silverlight.qxp 9/30/09 1:36 PM Page 321
Silverlight 2 y JavaScript
Las lneas anteriores toman un elemento HTML, para este caso, un botn, y adjuntan,
al evento OnClick de JavaScript para ese botn, un manejador que se encontrar tra-
bajando en la aplicacin Silverlight. Cuando el usuario presione sobre el botn HTML,
el mtodo BotonCliente_Click se disparar y podremos ejecutar nuestro cdigo.
Una vez disparado, podramos ejecutar la lgica de la aplicacin como para llamar a
servicios web que retornen informacin, o construir nuevo HTML para el usuario.
Esto puede convertirse en una herramienta poderosa si quisiramos encapsular lgi-
321
08_Silverlight.qxp 9/30/09 1:36 PM Page 322
8. EL NAVEGADOR Y SU DOMINIO
onchange: este evento se disparar cuando el control asociado sufra una modifica-
cin. En el caso de cajas de texto, si el usuario modifica su contenido; y en listas
desplegables, si otro elemento de la lista es seleccionado. En la mayora de los ca-
sos, el control deber perder el foco para que el evento aplique.
onclick: se dispara cuando el usuario presiona el elemento con el mouse.
onmouseover: ste se disparar cuando el mouse pase por arriba del elemento. Jun-
to con los valores pasados por argumento, se podrn encontrar las coordenadas
por las cuales el mouse se mueve.
onmouseout: en el momento en el que el mouse deje la superficie del control
HTML, este evento nos avisar.
onkeydown: si el usuario presiona una tecla cuando est dentro de un elemen-
to, por lo general representado por una caja de texto, podremos saber qu tecla
es la que est presionando.
onkeyup: si el usuario deja de presionar una tecla del teclado, el evento nos avisar.
onkeypress: si el usuario presion y solt una tecla, este evento se disparar.
onfocus: este evento ser ejecutado cada vez que un control tome el foco. Esto es,
que el cursor de escritura est sobre l o si el usuario hubiera presionado con el
botn del mouse sobre el control para conseguir el foco.
onblur: cada vez que un control pierda el foco, se disparar este evento.
onload: se dispara cuando la pgina termina de cargar todo su contenido.
onunload: cada vez que la pgina sea destruida, el evento nos avisar. Este even-
to asume que la pgina ser descargada de la memoria del navegador cuando
naveguemos a otra pgina o cuando presionemos un vnculo que haga que el
contenido de la pgina se recargue.
322
08_Silverlight.qxp 9/30/09 1:36 PM Page 323
Silverlight 2 y JavaScript
Llamar funciones
Como dijimos, tambin es posible llamar a funciones JavaScript desde cdigo Sil-
verlight. Esto nos ser de gran utilidad en casos en los que tengamos sitios web ya
implementados, con lgica incluida en lneas de cdigo JavaScript, y queramos ex-
tender esa funcionalidad desde Silverlight. Lo primero que necesitamos es algo de
cdigo JavaScript para poder utilizarlo desde Silverlight.
ScriptObject script =
(ScriptObject)HtmlPage.Window.GetProperty(MostrarMensaje);
script.InvokeSelf(Mensaje desde Silverlight. Nueva forma);
323
08_Silverlight.qxp 9/30/09 1:36 PM Page 324
8. EL NAVEGADOR Y SU DOMINIO
[ScriptableType()]
public partial class Page : UserControl
{
public Page()
{
InitializeComponent();
HtmlPage.RegisterScriptableObject(Silver, this);
}
[ScriptableMember()]
public void MostrarMensaje(string mensaje)
{
this.txtMensaje.Text = mensaje;
}
}
324
08_Silverlight.qxp 9/30/09 1:36 PM Page 325
Silverlight 2 y JavaScript
La primera lnea, ScriptableType(), marca la clase como un tipo que podr ser con-
sumido desde JavaScript. La siguiente lnea:
HtmlPage.RegisterScriptableObject(Silver, this);
<script type=text/javascript>
function Mostrar()
{
var micontrol = document.getElementById(AplicacionSilverlight);
micontrol.content.Silver.MostrarMensaje(Mensaje desde JavaScript.);
}
</script>
325
08_Silverlight.qxp 9/30/09 1:36 PM Page 326
8. EL NAVEGADOR Y SU DOMINIO
Tambin es posible crear objetos ms complejos para que sean consumidos desde
JavaScript. Podemos exponer una clase por completo y que sta pueda ser instan-
ciada y consumida desde el cdigo JavaScript. Veamos la siguiente clase:
[ScriptableType()]
public class Sumar2
{
[ScriptableMember()]
public long Sumar2Numeros(long valor1, long valor2)
{
return valor1 + valor2;
}
}
Esta clase posee una funcin que retornar la suma de los dos parmetros enviados.
Si registramos esta clase como cdigo JavaScript del cual se pueda crear una ins-
tancia, podremos acceder a sta como si se tratase de cdigo JavaScript.
HtmlPage.RegisterCreateableType(Sumar2, typeof(Sumar2));
En este caso, el objeto por construir desde JavaScript se llamar Sumar2 y tendr
disponibles todos los mtodos de la clase creada antes. Para obtener una instan-
cia de este objeto en JavaScript, deberemos hacer lo siguiente:
326
08_Silverlight.qxp 9/30/09 1:36 PM Page 327
Silverlight 2 y JavaScript
function Sumar() {
var MiControl = document.getElementById(AplicacionSilverlight);
var sumar2 = MiControl.content.services.createObject(Sumar2);
alert(sumar2.Sumar2Numeros(10, 20));
}
RESUMEN
En este captulo hemos visto que Silverlight tiene la capacidad de salir fuera de su marco tra-
dicional de ejecucin e interactuar con el entorno dentro del navegador, tanto con el cdigo
HTML como con el cdigo JavaScript. Este ltimo es posible ejecutarlo, manipularlo y consu-
mirlo para generar mayor interaccin con nuestro sitio web y con el usuario. Gracias a esto,
Silverlight no slo otorga funcionalidad dentro de su modelo de ejecucin, sino que tambin
extiende las funcionalidades circundantes dentro del navegador web.
327
08_Silverlight.qxp 9/30/09 1:36 PM Page 328
ACTIVIDADES
328
09_Silverlight_Apendice.qxp 9/30/09 1:37 PM Page 329
Silverlight Apndice A
Silverlight fuera
de Windows
Silverlight es una tecnologa provista
PROYECTO MOONLIGHT
Moonlight es un proyecto creado por la comunidad de desarrolladores y patro-
cinado por la compaa Novell. El objetivo de Moonlight es el de poder crear y
ejecutar aplicaciones Silverlight bajo sistemas operativos con base Linux y Unix.
De esta forma, es posible llevar el uso de esta tecnologa a la mayor gama de usua-
rios, sin importar su sistema operativo e, incluso, su navegador. Teniendo en
cuenta que de manera nativa Silverlight es soportado por Opera, Internet Ex-
plorer y Firefox bajo Windows y OS X de Apple, con Moonlight se ampla el
horizonte al ejecutar Silverlight en Linux con Firefox.
Sistemas operativos
Moonlight fue diseado para soportar diferentes sistemas operativos Linux, tanto para
arquitecturas x86 de 32 Bits como x86-64 para 64 Bits. En la Tabla 1, podemos ver la
lista de sistemas operativos y versiones de navegadores web soportados en cada caso.
ARQUITECTURA SISTEMA OPERATIVO FIREFOX 2.0 FIREFOX 3.0
x86 (32 Bits) SUSE Linux Enterprise Desktop 10 S S
openSUSE 11.0 S S
openSUSE 11.1 S S
Ubuntu 8.04 S S
Fedora Core 9 S S
x86-64 (64 bits) SUSE Linux Enterprise Desktop 10 S S
openSUSE 11.0 No S
Tabla 1. Sistemas operativos y navegadores web soportados por Moonlight.
330
09_Silverlight_Apendice.qxp 9/30/09 1:37 PM Page 331
Proyecto Moonlight
En cuanto a requerimientos, para ejecutar una aplicacin Silverlight desde Firefox, de-
beremos contar con 128 MB de memoria RAM, en cualquiera de las arquitecturas.
Versiones de Moonlight
En la actualidad, Moonlight cuenta con soporte total para Silverlight 1.0. La nueva
versin con soporte para Silverlight 2.0 contina en desarrollo y tiene fecha de sali-
da para septiembre de 2009. Esto puede ser un punto en contra para Moonlight y
los usuarios de Linux, porque Microsoft ya cuenta con la versin 3 de Silverlight li-
berada. Tengamos en cuenta que la capacidad de desarrollo y conocimiento sobre la
tecnologa Silverlight nace desde Microsoft, por lo que es natural pensar y esperar
que la empresa est un paso adelante en la entrega de nuevas versiones y de nuevas
funcionalidades para sus productos, mientras que la comunidad debe esperar la sali-
da de estos productos y tecnologas, analizarlos, estudiarlos, para luego poder imple-
mentarlos. Este ciclo continuo de nuevas versiones y constante aprendizaje por parte
de la comunidad acarrea este tipo de conflictos con las versiones, dejando a muchos
usuarios desactualizados y desatendidos. De cualquier manera, la nueva versin de
Moonlight pretende mostrar significantes cambios, como la inclusin de Deep
Zoom, Microsoft Media Pack 2.0 para manejo de video y sonido, la posibilidad
de utilizar los controles y componentes propuestos por Microsoft para Silverlight,
entre otras caractersticas que lo acercan mucho ms a su versin para Windows.
Herramientas de desarrollo
Si bien el comportamiento de la librera de clases provista por Microsoft es el mis-
mo usado por Moonlight, los creadores de ste no recomiendan el uso de Visual
Studio 2008 para la creacin de aplicaciones Silverlight especficas para Linux. Es-
to se debe a que, al estar Moonlight en continuo desarrollo, an presenta ciertos
errores, en especial para Silverlight 2, que podran causar un comportamiento no
esperado dentro de sistemas operativos basados en Linux. En todo caso, si qui-
siramos desarrollar directamente bajo Linux, los creadores recomiendan el uso
de la herramienta de desarrollo llamada MonoDevelop.
DESCARGAR MOONLIGHT
331
09_Silverlight_Apendice.qxp 9/30/09 1:37 PM Page 332
MonoDevelop es, tambin, una herramienta de uso libre y gratuito para el desarro-
llo con Mono, lo que quiere decir que nos proveer herramientas no slo para el de-
sarrollo de aplicaciones Silverlight, sino que podremos crear aplicaciones web y de
escritorio para Linux utilizando Microsoft .Net Framework como modelo base y C#
como lenguaje de desarrollo. A la fecha, MonoDevelop se encuentra en su versin 2,
y, como en toda comunidad de cdigo abierto, es posible participar en su mejora.
Como ya dijimos, Moonlight es un proyecto de la comunidad para la comunidad. s-
te es libre y de cdigo abierto. Por tal motivo, si deseamos colaborar en su mejora con-
tamos con la posibilidad de hacerlo. En el sitio web de Moonlight, podemos encontrar
las direcciones de los servidores SVN (Subversion o repositorio de versiones), que nos
darn acceso al cdigo y a cada una de las versiones histricas de estos archivos.
Si no contamos con un cliente SVN o herramienta similar, existen excelentes alterna-
tivas gratuitas que hallaremos en Internet. Por ejemplo, TortoiseSVN, una de las re-
comendadas y usadas ampliamente en el desarrollo de software. TortoiseSVN cuenta
con versiones para arquitecturas de 32 y 64 bits. No slo es til para este caso especi-
fico, ya que podemos sacarle provecho al incluirlo en nuestros desarrollos de software,
y al utilizarlo con sitios web que brindan servicios gratuitos de almacenamiento para
MONODEVELOP
Es importante recordar que MonoDevelop es una herramienta de uso libre y gratuito, con la
que podremos llevar nuestras aplicaciones .Net a la plataforma Linux, rompiendo la barrera
tradicional entre sistemas operativos. Podemos descargar MonoDevelop desde la siguiente
direccin: http://monodevelop.com.
332
09_Silverlight_Apendice.qxp 9/30/09 1:37 PM Page 333
Proyecto Moonlight
Problemas conocidos
Debido a que Moonlight se basa en el modelo de trabajo propuesto por Mono, las
limitaciones de este ltimo son traspasadas tambin a Moonlight y a la ejecucin
de Silverlight. Adems, por estar un paso atrs en el soporte de las versiones ofi-
ciales de Silverlight, otros problemas relacionados con la funcionalidad misma de
333
09_Silverlight_Apendice.qxp 9/30/09 1:37 PM Page 334
334
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 335
Silverlight Apndice B
Silverlight 3,
la nueva
generacin
En el momento en que se edita este libro,
Silverlight 3 336
Nuevos controles 336
Efectos en tres dimensiones 337
Uso de Pixel Shader 338
SERVICIO DE ATENCIN AL LECTOR: usershop@redusers.com Fuera del navegador 339
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 336
SILVERLIGHT 3
Silverlight 3 viene con grandes mejoras para el desarrollador, algo que tambin se tra-
duce en progresos para el usuario. Mejor uso del hardware del equipo cliente, imple-
mentacin de funcionalidades de tres dimensiones, mayor soporte para formatos de
video y sonido, y la posibilidad de ejecutar la aplicacin fuera del navegador son slo
algunas de los nuevos adelantos. Curiosamente, el tamao del plugin para descargar
por los navegadores es apenas menor que el de la versin anterior, lo que tambin nos
dice que el cdigo de ste se ha optimizado de manera sustancial al incorporar mayor
funcionalidad con menos lneas de cdigo por parte de su motor de ejecucin.
Nuevos controles
En esta entrega de Silverlight 3, fueron agregados nuevos controles. Muchos de
stos son para satisfacer necesidades puntuales sobre carencias anteriores. A la hora
de desarrollar aplicaciones, es comn encontrarse con necesidades bsicas sobre el
comportamiento de los controles, por lo que, si la tecnologa no trae la solucin
incluida en ella, es necesario construir lneas de cdigo con funcionalidad para
subsanar este problema. Por este motivo, es comn que Microsoft, por cada en-
trega de nuevas tecnologas, incorpore mayores controles de aquellos que recono-
ce como necesarios por parte de los desarrolladores. Uno de estos controles es el
campo de texto con la funcionalidad de autocompletar. Pasndole una fuente
de datos cualquiera, es posible que este control muestre una lista desplegable con
los elementos que coincidan con lo introducido por el usuario.
Si tenemos cualquier fuente de datos, incluso servicios web o WCF de donde ob-
tener esta informacin, este control nos mostrar los datos de cmo hacerlo.
ACTUALIZARSE
Para mantenerse actualizado sobre las nuevas funcionalidades incluidas en Silverlight 3, po-
demos ver los videos tutoriales en el sitio web oficial de Silverlight. Debemos ingresar en el
siguiente sitio para visualizar estos videos: http://silverlight.net/learn/. Vale aclarar que los
videos se encuentran en ingls.
336
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 337
Silverlight 3
337
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 338
Este tipo de proyecciones no slo se aplica a imgenes, sino que pueden ser usadas
en cualquier control provisto por Silverlight. Otros atributos presentados por el
modelo de proyeccin se refieren al punto de proyeccin. As como tenamos un
punto que representaba el eje de rotacin de un elemento, este punto de proyec-
cin sita ese eje de proyeccin tambin dentro del espacio de tres dimensiones,
pudiendo modificar por completo el comportamiento y la visualizacin de los objetos.
338
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 339
Silverlight 3
339
10_Silverlight_Apendice-b.qxp 9/30/09 1:38 PM Page 340
340
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 341
Silverlight
Servicios
al lector
En este apartado encontraremos una lista
tecnologa.
SERVICIOS AL LECTOR
NDICE TEMTICO
A Cookies 314
AJAX 15 CookieSilver 315
Almacenamiento aislado 239 CSS 178, 317
Animaciones 19, 45, 170, 175 Cursor 88
App.Config 271
AS 250 D
ASP.net 64, 317 Data 57, 218
Autocompletar 336 DataContext 278
AutoUpgrade 58 DataGrid 60, 68, 75, 132, 168, 231
DatePicker 60, 137, 147
B DateTime 135, 145
Background 48 Deep Zoom 199, 331
Barras de desplazamiento 98 Depuracin 62
Binding 276 Dibujar 213
BlackoutDates 142 Dibujo 46
Bool 135 DispatcherTimer 257
Border 48, 101, 168, 183 DisplayDate 143
BorderThickness 102 DisplayMode 250
Button 67, 103, 183 Distorsin 167
DLR 21
C DoubleAnimation 171
Caja de texto 128
Calendar 60, 139 E
Canvas 24, 92, 222, 229 Escalar 165
CheckBox 106, 123 Estilo 178
Clases 40 Etiquetas 22, 290
Class 318 Evento 72, 83, 261
Click 51, 71, 74, 103, 107, 198 Expression Blend 26, 30
ClientBin 203
Clip 217, 225 F
CLR 21 Flash 15
ColorAnimation 173 FontFamily 127
ComboBox 117 FontSize 127
Componentes 46, 67 FontWeight 127
Context 236
Contrasea 130 G
Controles 24 GetAttribute 294
Controles 46, 67 GetElementById 294
342
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 343
ndice temtico
GotFocus 84 L
Grid 67, 84, 89, 279 LayoutUpdated 84
GridSplitter 89 LinQ 21, 63, 74, 283
Grilla 47 ListBox 124, 252
GroupName 110 LostFocus 84
H M
Height 39, 85, 125, 302 Marcador 196
Hilos 255 Margin 68
HLSL 339 MarkerReached 197
Hojas de estilo 290, 317 MediaElement 48, 188, 216
HTA 83 MediaOpened 198
HTML dinmico 15 Moonlight 330
HTML 290 MouseMove 209
HtmlDocument 292
HtmlPage 300, 323 N
HtmlWindow 305, 310, 323 Name 57
HttpHandler 234 NavigateUri 113
HyperlinkButton 113 Nodo 83
NoWrap 128
I
IHttpHandler 236 O
IIS 270 OnClick 321, 325
Image 105, 114, 123, 215, 222 Onerror 57
InkPresenter 208, 225 OneTime 280
InnerHTML 295 OneWay 280
INPUT 297 OnExit 43
IntelliSense 61, 70 OnStartup 43
Interactividad 31 OpenFileDialog 251, 254
IsEnabledChanged 84
IsolatedStorageFile 240 P
IsolatedStorageFileStream 240 Param 57
IsolatedStorageSettings 240 Password 131
PasswordBox 130
J PasswordChar 131
JavaScript 290, 320 Pincel 211
Juego 222 Pixel Shader 338
Plantillas 58, 64, 178, 182
K Plugin 56
KeyDown 84 PointAnimation 171
KeyUp 84 PopupWindow 308
343
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 344
SERVICIOS AL LECTOR
344
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 345
PhotoSynth
http://photosynth.net
Este sitio web muestra el uso de la tecnologa PhotoSynth creada por Microsoft
Research. Esta tecnologa tiene la funcin de generar espacios en tres dimensiones
basados en fotografas. El software calcular los distintos puntos que componen un
espacio sobre la base de todas las imgenes disponibles de ese espacio.
345
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 346
SERVICIOS AL LECTOR
Bing
www.bing.com
El nuevo buscador de Microsoft incorpora funcionalidad creada con Silverlight para
interactuar con distintos servicios propuestos por la compaa. Es posible guardar las
bsquedas en SkyDrive, as como comentar y categorizar cada una de ellas.
346
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 347
ComponentArt
www.componentart.com
Compaa que provee controles y componentes de alta calidad para usar en el de-
sarrollo de nuestras aplicaciones. Los ltimos componentes creados por esta empresa
incluyen varios destinados al uso dentro de aplicaciones Silverlight (son pagos).
Infragistics
www.infragistics.com
Infragistics es otra empresa que provee controles y componentes visuales para el desa-
rrollo de aplicaciones. Presenta un gran abanico de controles para Silverlight listos pa-
ra usar. De igual forma que el sitio anterior, estos componentes y controles son pagos.
347
11_Silverlight_servicios.qxp 9/30/09 1:39 PM Page 348
SERVICIOS AL LECTOR
Quince
http://quince.infragistics.com
Sitio propuesto por la empresa Infragistics que nos otorga una serie de patrones de
diseo visual para aplicar en nuestros desarrollos. Con Quince, es posible entender
cmo podemos mejorar la usabilidad de las aplicaciones desarrolladas por nosotros.
Librera MSDN
http://msdn.microsoft.com/en-us/library/cc838158(VS.95).aspx
La librera MSDN para Silverlight propuesta por Microsoft es el manual de referen-
cia a todas las clases, mtodos, funciones, controles y componentes de Silverlight. Si te-
nemos alguna duda sobre el desarrollo para Silverlight, es necesario acudir a este sitio.
348
Catalogo_200RespRedes.qxd 11/21/08 2:21 PM Page 381
3 Compare precios
usershop.redusers.com
Adquiralo con todos los medios de pago
Captulo GRATIS Promocin Ofertas
tapa Silverlight.qxp 21/09/2009 11:07 a.m. Pgina 1
SILVERLIGHT
DESCUBRA UN NUEVO NIVEL EN EL DESARROLLO
CONTENIDO DE APLICACIONES PARA INTERNET
1 | INTRODUCCIN A SILVERLIGHT Desde su lanzamiento, Silverlight se convirti rpidamente en la
Experiencia de usuario y portabilidad | Arquitectura de
Silverlight 2 | Microsoft .NET Framework | Interfaz de usuario opcin multiplataforma ideal, tanto para desarrollar aplicaciones
y presentacin | El cdigo XAML | Herramientas de desarrollo
enriquecidas e interactivas, como para generar experiencias
2 | MICROSOFT EXPRESSION BLEND 2 multimedia de vanguardia. Quien consiga dominarlo podr ofrecer a
Silverlight con Expression Blend | Explorador de soluciones |
Entorno | Barra de herramientas | Crear nuestra primera sus clientes aplicaciones visualmente impresionantes, tiempos de
aplicacin respuesta sin comparacin y requerimientos mnimos de ancho de
3 | SILVERLIGHT PARA DESARROLLADORES banda, todas ventajas acordes a los tiempos de la incipiente Web 3.0.
Puesta a punto de Visual Studio 2008 | Crear la primera
aplicacin | Interoperabilidad con Expression Blend 2
Esta obra ofrece un acercamiento profundo y prctico a esta
herramienta, y est dirigida a desarrolladores con conocimiento
4 | XAML AL EXTREMO
El lenguaje XAML | Declaracin de objetos | Controles y de Microsoft .NET Framework, que deseen profundizar en el desa-
componentes | Grid | GridSplitter | Canvas | StackPanel | rrollo Web. La enorme experiencia de Matas Iacono como desa-
ScrollViewer | Border | Controles de iteracin con el usuario |
Button | CheckBox | RadioButton | HyperlinkButton | Image | rrollador en esta plataforma lo convierte en el gua ideal para
ComboBox | ListBox | TextBlock | TextBox | PasswordBox |
DataGrid | Calendar | DatePicker | ProgressBar | Slider
aportar consejos prcticos bien fundados, ejemplos enriquecedo-
res y cdigo optimizado para aplicar en sus propios proyectos.
5 | LUZ, CMARA, ACCIN
Mover objetos | Transformaciones de traslacin, rotacin,
escalar y distorsin | Animaciones | DoubleAnimation |
ColorAnimation | Estilos y plantillas redusers.com
En este sitio encontrar una gran variedad de recursos y software relacionado,
6 | CERRAR EL CRCULO que le servirn como complemento al contenido del libro. Adems, tendr la po-
MediaElement | Ejecutar sonidos | Elementos con video sibilidad de estar en contacto con los editores, y de participar del foro de lecto-
embebido | Deep Zoom | Dibujar con InkPresenter | reas
de dibujo
res, en donde podr intercambiar opiniones y experiencias.
7 | INTERCONEXIN
Ampliar las funcionalidades | Silverlight desde C# |
WebClient | Enviar informacin | Capacidad de
almacenamiento | OpenFileDialog | Manejo de hilos |
Temporizador | Hilos y eventos | Consumir servicios desde
Silverlight | Manipular datos | LinQ
8 | EL NAVEGADOR Y SU DOMINIO
Conectar tecnologas | Silverlight 2 y HTML | HtmlDocument
y HtmlElement | HtmlPage | HtmlWindow | Cookies |
Modificar CSS | Silverlight 2 y JavaScript | Llamar funciones
| Objetos para JavaScript