introduccion silverlight

60
1 Introducción a Silverlight Parte 1: Creando un Proyecto Silverlight ¿Cómo agrega Ud. Silverlight a su página Web? Un proyecto Silverlight típico tiene cuatro archivos: un archivo HTML que contiene (“hostea”) la instancia del Plug-In Silverlight, un archivo silverlight.js, un archivo XAML, y un archivo JavaScript que le da soporte al archivo HTML. Este documento describe cómo crear un proyecto básico, y agregarle contenido Silverlight al archivo HTML. Antes de Comenzar… Antes de poder crear contenido Silverlight, necesitará los siguientes elementos: - El Plug-In de Silverlight - Un archivo HTML para mostrar el contenido SilverLight - Un editor de texto, como Notepad para editar su archivo HTML. Paso 1: Agregue referencias al Script en su Página HTML En este paso, Ud. adicionará referencias apuntando a los archivos JavaScript Silverlight.js y createSilverlight.js en su página HTML y creará un elemento para contener (“host”) su Plug -In Silverlight. El archivo Silverlight.js es un archivo de soporte JavaScript que permite que su contenido Silverlight sea visualizado en múltiples plataformas. Ud. creará el archivo createSilverlight.js como parte del Paso 2. a. Obtenga el archivo Silverlight.js. Ud. puede obtener de la carpeta Tools (Herramientas) del Silverlight SDK. b. Abra su página HTML y adicione el siguiente “markup” dentro de la sección <head>: <script type=‖text/javascript‖ src=‖Silverlight.js‖></script> c. Cree un archivo vacío, y nómbrelo createSilverlight.js. Lo utilizará en el Paso 3. d. En su página HTML, adicione otra referencia dentro de la sección <head>. Esta vez especifíquelo como: <script type=”text/javascript” src=”createSilverlight.js”></script> e. Su página HTML debe contener los siguientes elementos básicos: <!DOCTYPE html PUBLIC //W3C//DTD XHTML 1.0 Transitional//EN‖ ―http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd‖> <html xmlns=‖http://www.w3.org/1999/xhtml‖ xml:lang=‖en‖> <head> <title>A Sample HTML page</title> <script type=‖text/javascript‖ src=‖Silverlight.js‖></script> <script type=‖text/javascript‖ src=‖createSilverlight.js‖></script> </head> <body> </body> </html>

Upload: escuela-virtual-de-caldas

Post on 18-Nov-2014

521 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Introduccion silverlight

1

Introducción a Silverlight

Parte 1: Creando un Proyecto Silverlight

¿Cómo agrega Ud. Silverlight a su página Web? Un proyecto Silverlight típico tiene cuatro archivos: un

archivo HTML que contiene (“hostea”) la instancia del Plug-In Silverlight, un archivo silverlight.js, un

archivo XAML, y un archivo JavaScript que le da soporte al archivo HTML. Este documento describe

cómo crear un proyecto básico, y agregarle contenido Silverlight al archivo HTML.

Antes de Comenzar…

Antes de poder crear contenido Silverlight, necesitará los siguientes elementos:

- El Plug-In de Silverlight

- Un archivo HTML para mostrar el contenido SilverLight

- Un editor de texto, como Notepad para editar su archivo HTML.

Paso 1: Agregue referencias al Script en su Página HTML

En este paso, Ud. adicionará referencias apuntando a los archivos JavaScript Silverlight.js y

createSilverlight.js en su página HTML y creará un elemento para contener (“host”) su Plug-In

Silverlight. El archivo Silverlight.js es un archivo de soporte JavaScript que permite que su contenido

Silverlight sea visualizado en múltiples plataformas. Ud. creará el archivo createSilverlight.js como parte

del Paso 2.

a. Obtenga el archivo Silverlight.js.

Ud. puede obtener de la carpeta Tools (Herramientas) del Silverlight SDK.

b. Abra su página HTML y adicione el siguiente “markup” dentro de la sección <head>: <script type=‖text/javascript‖ src=‖Silverlight.js‖></script>

c. Cree un archivo vacío, y nómbrelo createSilverlight.js. Lo utilizará en el Paso 3.

d. En su página HTML, adicione otra referencia dentro de la sección <head>. Esta vez

especifíquelo como:

<script type=”text/javascript” src=”createSilverlight.js”></script>

e. Su página HTML debe contener los siguientes elementos básicos:

<!DOCTYPE html PUBLIC

―//W3C//DTD XHTML 1.0 Transitional//EN‖

―http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd‖>

<html xmlns=‖http://www.w3.org/1999/xhtml‖ xml:lang=‖en‖>

<head>

<title>A Sample HTML page</title>

<script type=‖text/javascript‖ src=‖Silverlight.js‖></script>

<script type=‖text/javascript‖ src=‖createSilverlight.js‖></script>

</head>

<body>

</body>

</html>

Page 2: Introduccion silverlight

2

Paso 2: Crear el Elemento HTML “Host” y el Bloque de Inicialización

a) Cree el elemento HTML “host” adicionando las siguientes tres líneas a su archivo

HTML, entre las etiquetas (tags) <body>, en donde desea que aparezca su contenido

Silverlight.

<!—Lugar donde va el Plug-In Silverlight -->

<div id=‖mySilverlightPluginHost‖>

</div>

Ud. puede cambiar el ID de la etiqueta (tag) <div>, si desea. Si Ud. está creando

múltiples instancias del Plug-In Silverlight en la misma página, repita este paso para

cada instancia, y asegúrese que cada ID sea único.

b) Cree un bloque de inicialización: después del HTML que Ud. adicionó en el pase

previo, adicione el siguiente script y HTML.

<script type=‖text/javascript‖>

// Recobra el elemento div que Ud. creó en el paso previo

var parentElement =

document.getElementById(―mySilverlightPluginHost‖);

// Esta función crea el Plug-In Silverlight.

createMySilverlightPlugin();

</script>

Si está creando múltiples instancias del Plug-In Silverlight en la misma página, repita

este paso para cada instancia, asegurándose de que cada uno tenga nombres de función

únicos, o que utilice una función que tome un parámetro que utilice para establecer un

ID único. También asegúrese de que cada bloque de script siga inmediatamente al DIV

correspondiente creado en el paso previo.

Ud. ha llegado al fin del paso 2. Su archivo HTML debe contener los siguientes elementos:

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

<title>A Sample HTML page</title>

<script type="text/javascript" src="Silverlight.js"></script>

<script type="text/javascript" src="createSilverlight.js"></script>

</head>

<body>

<!—Lugar donde va el Plug-In Silverlight -->

<div id="mySilverlightPluginHost">

</div>

<script type="text/javascript">

// Recobra el elemento div que Ud. creó en el paso previo

var parentElement =

document.getElementById("mySilverlightPluginHost");

// Esta función crea el Plug-In Silverlight.

createMySilverlightPlugin();

</script>

</body>

</html>

Page 3: Introduccion silverlight

3

Paso 3: Defina la Función de Creación que Inicializa su instancia del Plug-In

Abra el archivo createSilverlight.js que creó en el paso 1 y adicione la siguiente función JavaScript:

function createMySilverlightPlugin()

{

Silverlight.createObject(

"myxaml.xaml", // Valor de Propiedad Source.

parentElement, // Referencia DOM a DIV tag hosteador.

"mySilverlightPlugin", // Valor de ID del plug-in.

{ // Propiedades por cada instancia.

width:'300', // Ancho del plug-in en pixels.

height:'300', // Altura del plug-in en pixels.

inplaceInstallPrompt:false, // Determina si desplegar prompt

// para instalar in-place

// si detecta versión inválida.

background:'#D6D6D6', // Color del fondo del plug-in.

isWindowless:'false', // Determina si mostrar plug-in

// en modo Windowless.

framerate:'24', // Valor propiedad MaxFrameRate.

version:'1.0' // Versión de Silverlight a usar.

},

{

onError:null, // Valor propiedad OnError --

// nombre función del event handler.

onLoad:null // Valor propiedad OnLoad --

// nombre función del event handler.

},

null); // Valor Contexto – event handler.

}

Este script contiene varios parámetros que Ud. querrá ajustar, tales como la altura y el ancho del Plug-In

(permite tamaños en porcentajes), el nombre del archivo que contiene su contenido Silverlight, y un valor

que especifica si el comportamiento del Plug-In es sin ventana (windowless).

Si está adicionando múltiples Plug-In Silverlight a la misma página, cree una nueva función para cada

uno, o utilice una función de creación parametrizada. En cualquier caso, asegúrese de que cada resultado

de la llamada a la función especifica un valor diferente para el ID del Plug-In (en nuestro ejemplo,

“mySilverlightPlugin”.

Paso 4: Cree sus Archivos de Contenido Silverlight

Ahora que su archivo HTML ha sido configurado, pasamos a crear su contenido.

a. Cree un archivo en blanco llamado “myxaml.xml” en el mismo diectorio que su archivo HTML.

Si Ud. modifica su parámetre de Archivo Fuente (Source File), también cambie el nombre de

este archivo para que concuerden.

b. (Opcional) Si desea que el proyecto Silverlight maneje eventos, genere código dinámicamente, o

de cualquier manera interactúe con el usuario, necesitará contener un archivo de script adicional.

Cree un archivo JavaScript para contener el script y luego adicione una referencia hacia dicho

archivo desde en su página HTML anfitrión. El siguiente ejemplo crea una referencia al archivo

de script llamado my-script.js

<script type=‖text/javascript‖ src=‖my-script.js‖></script>

Page 4: Introduccion silverlight

4

Su archivo HTML debería contener los siguientes elementos:

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

<title>A Sample HTML page</title>

<script type="text/javascript" src="Silverlight.js"></script>

<script type="text/javascript" src="createSilverlight.js"></script>

<script type="text/javascript" src="my-script.js"></script>

</head>

<body>

<!—Lugar donde va el Plug-In Silverlight -->

<div id="mySilverlightPluginHost">

</div>

<script type="text/javascript">

// Recobra el elemento div que Ud. creó en el paso previo

var parentElement =

document.getElementById("mySilverlightPluginHost");

// Esta función crea el Plug-In Silverlight.

createMySilverlightPlugin();

</script>

</body>

</html>

Creando Múltiples Instancias del Plug-In Silverlight

Si desea crear más de un plug-in Silvelight en su página, repita los pasos 2, 3 y 4 para cada instancia.

- Cada etiqueta <div> del anfitrión (creada en el paso 2a) debe tener un ID único.

- Cada bloque de inicialización (creado en el paso 2b) debe seguir inmediatamente a la etiqueta

<div> creada en el paso precedente (2a).

- Cada parámetro ID de plug-in debe también ser única.

Page 5: Introduccion silverlight

5

Parte 2: Crear un archivo XAML Silverlight

En el paso precedente, Ud. agregó un Plug-In Silverlight a una página HTML, y creó un archivo XAML

en blanco. Acá se muestra cómo comenzar a crear contenido Silverligth en su archivo XAML.

- paso 1: crear un Canvas (lienzo) y declaraciones para los namespaces.

- paso 2: ¡Dibuje algo!

- paso 3: vea su contenido XAML

Paso 1: Cree un Lienzo (Canvas) y declaraciones para los namespaces

Abra el archivo XAML myxaml.xml que Ud. creó en el paso pevio. Cree un lienzo (Canvas) y las

declaraciones de namespaces Silverlight y XAML con el siguiente contenido:

<Canvas

xmlns=‖http://schemas.microsoft.com/client/2007‖

xmlns:x=‖http//schemas.microsoft.com/winfx/2006/xaml‖>

</Canvas>

Cada archivo XAML Silverlight comienza con una etiqueta <Canvas> que contiene las declaraciones de

namespace Silverlight y un atributo xmlns que declara el namespace Silverlight junto a un atributo

xmlns:x que declara el namespace del XAML.

Paso 2: ¡Dibuje algo!

Escriba lo siguiente en el archivo XAML, entre las etiquetas <Canvas> y almacene el archivo.

<Ellipse

Height=‖200‖ Width=‖200‖

Stroke=‖Black‖ StrokeThickness=‖10‖ Fill=‖SlateBlue‖ />

Paso 3: Vea su Contenido XAML

Para ver su contenido XAML, dé doble click sobre el archivo HTML anvitrión. Ud. deberá ver un círculo

de color azulado con un borde negro.

El archivo XAML queda así:

<Canvas

xmlns=‖http://schemas.microsoft.com/client/2007‖

xmlns:x=‖http//schemas.microsoft.com/winfx/2006/xaml‖>

<Ellipse

Height=‖200‖ Width=‖200‖

Stroke=‖Black‖ StrokeThickness=‖10‖ Fill=‖SlateBlue‖ />

</Canvas>

Page 6: Introduccion silverlight

6

Nota: Si tiene instalado WPF y da doble –click sobre el archivo XML con contenido XAML (en vez de la

página Web) se lanzará WPF en vez de Silverlight. El acto de dar doble-click sobre un archivo XAML

no es parte de la experiencia del usuario final de Silverlight, ya que la espectativa es que archivos XAML

proporcionados para una aplicación basada en Silverlight vienen del mismo servidor que sirvió la página

HTML.

Page 7: Introduccion silverlight

7

Parte 3: El Objeto Canvas (como el Lienzo de un artista)

Un Canvas es un objeto diseñado para contener y posicionar formas (shapes) y controles. Cada archivo

XAML Silverlight contiene al menos un Canvas, que le sirve como elemento raíz (root). Esta sección

introduce al objeto canvas y describe cómo adicionar, posicionar y especificar el tamaño de sus objetos

hijo. Esta parte contiene las siguientes secciones:

- Adicionar un objeto a su Canvas

- Posicionar un objeto

- Controlar el ancho y el alto

- Objetos Canvas anidados

Adicionar un objeto a su Canvas

Un Canvas contiene y posiciona otros objetos. Para adicionar un objeto a un Canvas, insértelo entre las

etiquetas (tags) de <Canvas>. El siguiente ejemplo adiciona un objeto Ellipse a un Canvas. Debido a que

el Canvas es el elemento raíz, es una buena práctica de XML aprovechar el elemento raíz (root) para

hacer allí las declaraciones xmlns (namespace).

<Canvas

xmlns=‖http://schemas.microsoft.com/Client/2007‖

xmlns=‖http://schemas.microsoft.com/winfx/2006/xaml‖ >

<Ellipse

Height=‖200‖ Width=‖200‖

Stroke=‖Black‖ StrokeThickness=‖10‖ Fill=‖SlateBlue‖ />

</Canvas>

Un Canvas puede contener cualquier número de objetos, aún otros objetos Canvas.

Page 8: Introduccion silverlight

8

Posicionando un Objeto

Para posicionar un objeto en el Canvas, Ud. especifica las propiedades incluídas de Canvas.Left y

Canvas.Top del objeto en cuestión. La propiedad incluída (attached property) Canvas.Left especifica la

distancia entre un objeto y el borde izquierdo de su Canvas padre, y la propiedad incluída Canvas.Top

especifica la distancia entre el objeto hijo y el borde superior de su Canvas padre. El siguiente ejemplo

toma la Ellipse del ejemplo previo y lo mueve 30 pixeles desde la izquierda y 30 pixeles desde la parte

superior del Canvas.

<Canvas

xmlns=‖http://schemas.microsoft.com/Client/2007‖

xmlns=‖http://schemas.microsoft.com/winfx/2006/xaml‖ >

<Ellipse

Canvas.Left=‖30‖ Canvas.Top=‖30‖

Height=‖200‖ Width=‖200‖

Stroke=‖Black‖ StrokeThickness=‖10‖ Fill=‖SlateBlue‖ />

</Canvas>

La siguiente ilustración muestra el sistema de coordenadas del Canvas y la posición de la Ellipse.

Canvas.Left=”30”

Canvas.Top=”30” 0,0

Page 9: Introduccion silverlight

9

Z-Order

Por defecto, el orden Z (z-order) de los objetos dentro de un Canvas está determinada por la secuencia en

que son declarados. Los objetos declarados más tarde aparecen enfrente de objetos declarados al inicio. El

siguiente ejemplo crea tres objetos Ellipse. Observe que la Ellipse declarada de último (el de color lima)

está en el primer plano (foreground), enfrente de los otros objetos Ellipse.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse

Canvas.Left="5" Canvas.Top="5"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="Silver" />

<Ellipse

Canvas.Left="50" Canvas.Top="50"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="DeepSkyBlue" />

<Ellipse

Canvas.Left="95" Canvas.Top="95"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="Lime" />

</Canvas>

Page 10: Introduccion silverlight

10

Ud. puede modificar este comportamiento al especificar la propiedad incluída (attached property)

Canvas.ZIndex en los objetos dentro del Canvas. Los valores mayores están más cerca del primer plano

(foreground); los valores más bajos están más lejos del primer plano. El siguiente ejemplo es similar al

previo, excepto que los z-order de los objetos Ellipse van al revés. La Ellipse que declaramos de primero

(la de color plateado) está ahora al frente.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse

Canvas.ZIndex="3"

Canvas.Left="5" Canvas.Top="5"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="Silver" />

<Ellipse

Canvas.ZIndex="2"

Canvas.Left="50" Canvas.Top="50"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="DeepSkyBlue" />

<Ellipse

Canvas.ZIndex="1"

Canvas.Left="95" Canvas.Top="95"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="Lime" />

</Canvas>

Page 11: Introduccion silverlight

11

Controlando Ancho y Alto (Width y Height)

Los Canvas, las formas (shapes) y muchos otros elementos tienen propiedades de Width (Ancho) y

Height (Altura) que le permiten especificar su tamaño. El siguiente ejemplo crea una Ellipse de 200 pixels

de ancho y 200 pixels de alto. Note que carece de soporte para tamaños en porcentajes.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse

Canvas.Left="30" Canvas.Top="30"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue" />

</Canvas>

Page 12: Introduccion silverlight

12

El siguiente ejemplo establece el Width (Ancho) y Height (Alto), pero esta vez del Canvas padre, a un

valor de 200 y le da un fondo verde lima.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="200" Height="200"

Background="LimeGreen" >

<Ellipse

Canvas.ZIndex="3"

Canvas.Left="30" Canvas.Top="30"

Height="200" Width="200"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue" />

</Canvas>

Cuando corra el ejemplo, el cuadrado verde lima es el Canvas, y el fondo gris es la porción del area del

plug-in anfitrión que no ha sido cubierto por el Canvas. Note que la Ellipse no está cortada, a pesar de que

se sale de los límites del Canvas.

Tanto el Width como el Height toman el valor de cero (0) si no lo establece explícitamente.

Page 13: Introduccion silverlight

13

Objetos Canvas anidados (nested)

Los Canvas pueden contener otros objetos Canvas. El siguiente ejemplo crea un Canvas que a su vez

contiene otros dos objetos Canvas.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas Height="50" Width="50" Canvas.Left="30" Canvas.Top="30"

Background="blue"/>

<Canvas Height="50" Width="50" Canvas.Left="130" Canvas.Top="30"

Background="red"/>

</Canvas>

Page 14: Introduccion silverlight

14

Parte 4: Dibujando y Pintando (Drawing and Painting)

Silverlight soporta gráficas vectoriales básicas al proveer los elementos Ellipse, Rectangle, Line, Polyline,

Polygon y Path. Colectivamente, estos elementos son conocidos como los elementos Shape.

Esta parte contiene las siguientes secciones:

- Shapes (formas) básicas

- Otros elementos Shape

- Pintando Shapes con brochas (brushes)

Shapes (formas) básicas

Silverlight provee tres elementos básicos de Shape: Ellipse, Rectangle y Line

- Un elemento Ellipse describe un óvalo o círculo. Ud. controla su diámetro horizontal

estableciendo la propiedad Width (Ancho), y su diámetro vertical estableciendo su propiedad

Height (Altura).

- Un elemento Rectangle describe un Shape cuadrado o rectangular, opcionalmente con esquinas

redondeadas. Ud. controla su tamaño horizontal estableciendo su propiedad Width, y su tamaño

vertical estableciendo su propiedad Height. Ud. puede también usar las propiedades RadiusX y

RadiusY para controlar la curvatura de sus esquinas.

- En el caso del elemento Line, en vez de usar Width y Height, Ud. controla su tamaño y

colocación estableciendo sus propiedades X1, Y1 y X2, Y2.

El siguiente ejemplo dibuja una Ellipse, un Rectángulo y una Línea en el Canvas.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse Height=‖200‖ Width=‖200‖ Canvas.Left=‖30‖ Canvas.Top=‖30‖

Stroke=‖Black‖ StrokeThickness=‖10‖ Fill=‖SlateBlue‖ />

<Rectangle Height=‖300‖ Width=‖100‖

</Canvas>

Page 15: Introduccion silverlight

15

Otros elementos Shape

En adición a los elementos Ellipse, Line y Rectangle, Silverlight provee tres otros elementos Shape:

Polygon, Polyline y Path. Un Polygon es un shape cerrado con un número arbitrario de lados, mientras

que un Polyline es una serie de lineas conectadas que podrían o podrían no formar un Shape cerrado. El

siguiente ejemplo crea un Polygon y un Polyline.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Polyline Points="150,150 150,250 250,250 250,150"

Stroke="Black" StrokeThickness="10" />

<Polygon Points="10,10 10,110 110,110 110,10"

Stroke="Black" StrokeThickness="10" Fill="Lightblue" />

</Canvas>

El elemento Path puede usarse para representar formas (Shapes) complejos que incluyen curvas y arcos.

Para usar un elemento Path, Ud. utiliza un tipo especial de sintaxis de atributos para especificar su

propiedad Data. El siguiente ejemplo crea tres elementos Path.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Path Data="M0,0 L11.5,0 11.5,30 5.75,40 0,30z"

Stroke="Black" Fill="SlateBlue"

Canvas.Left="10" Canvas.Top="10" />

<Path Data="M 0,100 C 10,300 300,-200 250,100z"

Stroke="Red" Fill="Orange"

Canvas.Left="10" Canvas.Top="10" />

<Path Data="M 0,200 L100,200 50,50z"

Stroke="Black" Fill="Gray"

Canvas.Left="150" Canvas.Top="70" />

</Canvas>

Page 16: Introduccion silverlight

16

Para mayor información sobre la sintaxis de marca (markup) de los path, busque Path Markup Syntax en

el SDK de Silverlight.

Pintando Formas (Shapes) con Brochas (Brushes)

La mayoría de formas contienen dos partes: un stroke (el contorno) y un Fill (relleno), los cuales se

controlan a través de las propiedades Stroke y Fill. La siguiente ilustración etiqueta el stroke y el fill del

rectángulo dibujado en el primer ejemplo.

No todas las formas tienen ambos: Fill y Stroke. Un Line sólo tiene Stroke. Si establece la propiedad Fill

en una línea, no tiene efecto alguno.

Ud. puede establecer el Stroke y el Fill con un Brush (Brocha). Hay cinco tipos objetos Brush que puede

utilizar:

SolidColorBrush

LinearGradientBrush

RadialGradientBrush

ImageBrush

VideoBrush

Stroke

Fill

Page 17: Introduccion silverlight

17

Pintando con Colores Sólidos con un SolidColorBrush

Para pintar un área de un color sólido, Ud. utiliza un SolidColorBrush. XAML provee varias formas de

crear un SolidColorBrush.

- Ud. puede utilizar sintaxis de atributos para especificar el nombre de un color, tales como

“Black” o “Gray”

- Ud. puede usar sintaxis de atributos con notación hexadecimal para describir los valores rojo,

verde, y azul de un color; y opcionalmente su transparencia. Hay varios formatios que puede

utilizar:

o Notación de 6 dígitos. El formato es #rrggbb, don rr es un valor hexadecimal de dos

dígitos que describe la cantidad de rojo en el color, gg describe la cantidad de verde, y

bb describe la cantidad de azul. Por ejemplo, #0033FF.

o Notación de 8 dígitos. El formato es el mismo que el de 6 dígitos, excepto por dos

valores adicionales para describir el valor de alpha, u opacidad, del color #aarrggbb. Por

ejemplo, #990033FF.

o También hay notaciones de 3 y 4 dígitos para color de 8-bits, pero éstos no son

comunmente usados.

- Ud. puede utilizar sintaxis de elemento de objeto para crear explícitamente un SolidColorBrush

y especificar su propiedad Color, usando uno de los formatos de cadena descritos para la sintaxis

de atributo.

El siguiente ejemplo muestra varias formas de pintar un objeto de negro.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse Height="90" Width="90" Canvas.Left="10" Canvas.Top="10"

Fill="Black" /> <!-- SolidColorBrush por nombre de color -->

<Ellipse Height="90" Width="90" Canvas.Left="110" Canvas.Top="10"

Fill="#000000" /> <!-- SolidColorBrush por notacion hexadecimal de 6

digitos -->

<Ellipse Height="90" Width="90" Canvas.Left="10" Canvas.Top="110"

Fill="#ff000000" /> <!-- SolidColorBrush por notacion hexadecimal de 8

digitos -->

<Ellipse Height="90" Width="90" Canvas.Left="110" Canvas.Top="110">

<Ellipse.Fill>

<!-- SolidColorBrush por sintaxis de object element -->

<SolidColorBrush Color="Black" />

</Ellipse.Fill>

</Ellipse>

</Canvas>

Page 18: Introduccion silverlight

18

Pintando Gradientes con LinearGradientBrush y RadialGradientBrush

Silverlight soporta gradientes tanto lineares como radiales. Los gradientes tienen uno o más Paradas de

Gradiente (Gradient Stops) que describen los diferentes colores entre los que transiciona el gradiente, y la

localización de dichos colores. La mayoría de gradientes sólo necesitan dos Gradient Stops, pero Ud.

puede agregar tantos Gradient Stops como necesite.

- LinearGradientBrush pinta un gradiente siguiendo una línea. Esta línea es diagonal por default, y

va desde la esquina superior izquierda hacia la esquina inferior derecha del objeto pintado. Ud.

puede utilizar las propiedades StartPoint y EndPoint paa cambiar la posición de la línea.

- RadialGradientBrush pinta una gradiente a lo largo de un círculo. Por defecto, el círculo está

centrado en el área que se está pintando. Ud. puede cambiar el gradiente estableciendo sus

propiedades GradientOrigin, Center, RadiusX y RadiosY

Para adicionar Gradient Stops a un Gradient Brush, Ud. crea objetos GradientStop. Establezca la

propiedad Offset de un GradientStop a un valor entre 0 y 1, para establecer su posición relativa en el

gradiente. Establezca la propiedad Color del GradientStop a un color nombrado o valor hexadecimal.

Page 19: Introduccion silverlight

19

El siguiente ejemplo utiliza objetos LinearGradientBrush y RadialGradientBrush para pintar cuatro

objetos rectangulares.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<!-- Linear gradients -->

<Rectangle Width="140" Height="70" Canvas.Left="10" Canvas.Top="10">

<Rectangle.Fill>

<LinearGradientBrush>

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Red" Offset="0.25" />

<GradientStop Color="Blue" Offset="0.75" />

<GradientStop Color="LimeGreen" Offset="1.0" />

</LinearGradientBrush>

</Rectangle.Fill>

</Rectangle>

<Rectangle Width="140" Height="70" Canvas.Left="155" Canvas.Top="10">

<Rectangle.Fill>

<LinearGradientBrush StartPoint="0,0" EndPoint="1,0">

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Red" Offset="0.25" />

<GradientStop Color="Blue" Offset="0.75" />

<GradientStop Color="LimeGreen" Offset="1.0" />

</LinearGradientBrush>

</Rectangle.Fill>

</Rectangle>

<!-- Radial gradients -->

<Rectangle Width="140" Height="70" Canvas.Left="10" Canvas.Top="110">

<Rectangle.Fill>

<RadialGradientBrush>

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Red" Offset="0.25" />

<GradientStop Color="Blue" Offset="0.75" />

<GradientStop Color="LimeGreen" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<Rectangle Width="140" Height="70" Canvas.Left="155" Canvas.Top="110">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="1,0" >

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Red" Offset="0.25" />

<GradientStop Color="Blue" Offset="0.75" />

<GradientStop Color="LimeGreen" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

</Canvas>

Page 20: Introduccion silverlight

20

Ud. también puede utilizar gradientes para pintar el Stroke (contorno) de un Shape.

La siguiente ilustración muestra las paradas de gradiente del primer LinearGradientBrush de ejemplo

previo.

Pintando con Imágenes usando ImageBrush

Otro tipo de brocha (brush) es el ImageBrush. Por defecto, la imagen es estirada hasta llenar la forma

completa, pero Ud. puede utilizar la propiedad Stretch para controlar cómo la brocha estira su imagen. El

siguiente ejemplo usa dos objetos ImageBrush con diferentes valores de Stretch para pinta dos objetos

Rectangle.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Rectangle Height="180" Width="90" Canvas.Left="10" Canvas.Top="10"

Stroke="Black" StrokeThickness="1">

<Rectangle.Fill>

<ImageBrush ImageSource="tacuba.jpg"/>

</Rectangle.Fill>

</Rectangle>

<Rectangle Height="180" Width="90" Canvas.Left="110" Canvas.Top="10"

Stroke="Black" StrokeThickness="1">

<Rectangle.Fill>

<ImageBrush ImageSource="tacuba.jpg" Stretch="Uniform"/>

</Rectangle.Fill>

</Rectangle>

</Canvas>

Gradient Stop #1 Color: Yellow

Offset: 0.0

Gradient Stop #2 Color: Red Offset: 0.25

Gradient Stop #3 Color: Blue Offset: 0.75

Gradient Stop #4 Color: Green Offset: 1.0

Page 21: Introduccion silverlight

21

Parte 5: Propiedades Gráficas Comunes

Algunas propiedades aplican a todos los objetos UIElement de Silverlight: Canvas, Shapes, el

MediaElement y TextBlock. Este documento describe las propiedades gráficas que tienen en común estos

objetos.

Esta parte contiene las siguientes secciones

- La propiedad Opacity

- La propiedad OpacityMask

- La propiedad Clip

- La propiedad RenderTransform

La propiedad Opacity

La propiedad Opacity le permite controlar el valor alpha, o de transparencia, de un UIElement. Ud. puede

establecer la propiedad opacity a un valor entre cero y uno. Mientras más cerca está de cero, se vuelve

más transparente el objeto. En el valor cero, el objeto es completamente invisible. El valor por defecto de

Opacity es 1.0, lo cual es completamente opaco. El siguiente ejemplo crea dos formas con diferente valor

de opacidad.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Rectangle Opacity="1.0" Height="100" Width="100" Canvas.Left="30" Canvas.Top="30"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue"/>

<Rectangle Opacity="0.6" Height="100" Width="100" Canvas.Left="70" Canvas.Top="70"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue" />

</Canvas>

Page 22: Introduccion silverlight

22

La Propiedad OpacityMask

La propiedad OpacityMask le permite controlar el valor alpha de diferentes porciones de un UIElement.

Por ejemplo, Ud. puede usar el OpacityMask para hacer que un elemento se vuelva transparente (fade) de

derecha a izquierda. La propiedad OpacityMask toma un objeto Brush (Brocha). El Brush es mapeado al

elemento y el canal alpha de cada uno de los pixeles de la brocha es usado para determinar la opacidad

resultante de los pixeles correspondientes del elemento. Si una porcion dada del Masking Brush es

transparente, esa porción del elemento enmascarado se vuelve transparente.

Ud. puede usar cualquier tipo de brocha como un OpacityMask, pero los más útiles son

LinearGradientBrush, RadialGradientBrush e ImageBrush.

El siguiente ejemplo aplica una máscara de opacidad LinearGradientBrush a un objeto Rectangle.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Rectangle Height="100" Width="100" Canvas.Left="30" Canvas.Top="30"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue">

<Rectangle.OpacityMask>

<LinearGradientBrush>

<GradientStop Offset="0.25" Color="#00000000"/>

<GradientStop Offset="1" Color="#FF000000"/>

</LinearGradientBrush>

</Rectangle.OpacityMask>

</Rectangle>

</Canvas>

Page 23: Introduccion silverlight

23

La Propiedad Clip

La propiedad Clip le permite dibujar porciones de un elemento. Para usar la propiedad Clip, Ud. provee

un objeto Geometry que describe la región que debe ser dibujada. Todo lo que caiga fuera de la geometría

es invisible, o “clipped” (cortado).

El siguiente ejemplo usa un RectangleGeometry como el Clip de un elemento Ellipse. Como resultado,

sólo muestra la porción de la Ellipse dentro del área definida por RectangleGeometry. La porción fuera

del RectangleGeometry es cortada.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse Height="200" Width="200" Canvas.Left="30" Canvas.Top="30"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue">

<Ellipse.Clip>

<RectangleGeometry Rect="0, 0, 100, 100"/>

</Ellipse.Clip>

</Ellipse>

</Canvas>

La Propiedad RenterTransform

La propiedad RenderTransform le permite usar objetos Transform para rotar, skew (inclina), escalar, o

trasladar (mover) un elemento. La siguiente lista describe los diferentes objetos Transform que Ud. puede

utilizar con la propiedad RenderTransform.

- RotateTransform: Rota un objeto por una cantidad específica, expresada en grados.

- SkewTransform: Inclina (skews) un objeto por el valor especificado a lo largo de, ya sea el eje X

o el eje Y.

- ScaleTransform: Hace más grande o pequeño un objeto horizontalmente o verticalmente por la

cantidad especificada.

- TranslateTransform: Mueve un objeto horizontalmente o verticalmente por la cantidad

especificada.

También hay un tipo especial de transformación, TransformGroup, que Ud. puede utilizar para plicar

mútiples transformaciones en secuencia a un solo objeto. Por ejemplo, Ud. puede rotar y luego inclinar

(skew) un objeto.

El siguiente ejemplo demuestra cada uno de los objetos Transform usándolos para transformar elementos

Rectangle.

Page 24: Introduccion silverlight

24

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Rectangle Height="100" Width="100" Canvas.Left="70" Canvas.Top="10"

Fill="Black">

<Rectangle.RenderTransform>

<RotateTransform Angle="45"/>

</Rectangle.RenderTransform>

</Rectangle>

<Rectangle Height="100" Width="100" Canvas.Left="130" Canvas.Top="10"

Fill="red">

<Rectangle.RenderTransform>

<SkewTransform AngleX="30"/>

</Rectangle.RenderTransform>

</Rectangle>

<Rectangle Height="100" Width="100" Canvas.Left="10" Canvas.Top="190"

Fill="blue">

<Rectangle.RenderTransform>

<ScaleTransform ScaleX="1.3" ScaleY=".5"/>

</Rectangle.RenderTransform>

</Rectangle>

<Rectangle Height="100" Width="100" Canvas.Left="160" Canvas.Top="130"

Fill="Green">

<Rectangle.RenderTransform>

<TransformGroup>

<RotateTransform Angle="45"/>

<ScaleTransform ScaleX=".5" ScaleY="1.2"/>

<SkewTransform AngleX="30"/>

</TransformGroup>

</Rectangle.RenderTransform>

</Rectangle>

</Canvas>

Page 25: Introduccion silverlight

25

Parte 6: Imágenes

El elemento Image le permite desplegar imágenes de mapa de bits (bitmap) en Silverlight. Esta parte

contiene las siguientes secciones:

- El elemento Image

- La propiedad Stretch

- Otras formas de usar bitmaps

El Elemento Image

El elemento Image provee una forma conveniente de desplegar imágenes JPG y PNG en Silverlight. Para

mostrar una imagen, establezca la propiedad Source del objeto Image para que especifique el camino

(path) hacia el archivo fuente de su imagen. El siguiente ejemplo usa un elemento Image para mostrar una

imagen tipo bitmap. Debido a que las propiedades del Image: Width y Height no están especificadas, el

bitmap es mostrado en su tamaño nativo.

(Nota: en mi ejemplo, la imagen es tan grande con respecto al area del Plug-In Silverlight que sólo se ve

una esquina de la foto)

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Image Source="tacuba.jpg" />

</Canvas>

Page 26: Introduccion silverlight

26

La Propiedad Stretch

Cuando el tamaño del elemento Image y el tamaño de su bitmap son diferentes, la propiedad Stretch

determina cómo se estira el bitmap para que se ajuste al elemento Image. La propiedad Stretch toma los

siguientes valores: None, Fill, Uniform, UniformToFill. El siguiente ejemplo demuestra las propiedades

None, Uniform, y Fill.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Image Source="tacuba.jpg" Stretch="None"

Height="95" Width="200" Canvas.Left="45" />

<Image Source="tacuba.jpg" Stretch="Fill"

Height="95" Width="200" Canvas.Left="45" Canvas.Top="100" />

<Image Source="tacuba.jpg" Stretch="Uniform"

Height="95" Width="200" Canvas.Left="45" Canvas.Top="200" />

</Canvas>

Otras Formas de utilizar Bitmaps

Para usar un Bitmap como un fondo, utilice el objeto ImageBrush. Vea la parte de Dibujar y Pintar para

mayor información.

Page 27: Introduccion silverlight

27

Parte 7: Texto

El elemento TextBlock le permite adicionar texto a su contenido Silverlight. Este documento describe

cómo usar el elemento TextBlock.

Esta parte contiene las siguientes secciones:

- El elemento TextBlock

- Propiedades comunes del TextBlock

- El elemento Run

- Especificando múltiples Fonts

El Elemento TextBlock

Para adicionar texto a su contenido Silverlight, cree un elemento TextBlock y adicione el contenido

textual entre las etiquetas (tags) <TextBlock>. El siguiente ejemplo usa un TextBlock para desplegar

texto.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<TextBlock>hello world!</TextBlock>

</Canvas>

Page 28: Introduccion silverlight

28

Propiedades Comunes del TextBlock

En adición a las propiedades que recibe por ser un UIElement, tales como Clip y Opacity, el elemento

TextBlock provee varias propiedades adicionales, incluyendo los siguientes:

- FontSize: El tamaño del font, en pixeles.

- FontStyle: El estilo del font. Las opciones son Normal o Italic.

- FontStretch: Estiramiento del font. Las opciones son UltraCondensed, ExtraCondensed,

Condensed, SemiCondensed, Normal, Medium, SemiExpanded, Expanded, ExtraExpanded o

UltraExpanded.

- FontWeight: El peso del font. Las opciones son: Thin, Extralight, Light, Normal, Medium,

SemiBold, Bold, ExtraBold, Black, ExtraBlack.

- FontFamily: El nombre de la familia del typeface (tipo de letra).

- Foreground: La brocha (Brush) que pinta el texto dentro del TextBlock. Ud. puede usar un color

sólido, un gradiente, o una imagen o video. Para mayor información, vea la parte de dibujar con

Shapes y pintar con Brushes.

El siguiente ejemplo demuestra estas propiedades:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<TextBlock FontSize="40"

FontFamily="Georgia"

FontStyle="Italic" FontWeight="Bold"

FontStretch="Expanded"

Canvas.Top="20" Canvas.Left="20">

Hello world!

<TextBlock.Foreground>

<LinearGradientBrush>

<GradientStop Color="SlateBlue" Offset="0.0" />

<GradientStop Color="Black" Offset="1.0" />

</LinearGradientBrush>

</TextBlock.Foreground>

</TextBlock>

</Canvas>

Page 29: Introduccion silverlight

29

El Elemento Run

Ud. puede mezclar diferentes fonts en el mismo TextBlock usando el elemento Run. Run tiene las mismas

propiedades de font que TextBlock, pero no puede ser posicionado con las propiedades Canvas.Left y

Canvas.Top. El siguiente ejemplo usa un elemento Run para cambiar el tamaño de algo, pero no todo, el

text de un TextBlock.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<TextBlock>

Hello <Run FontSize="30">world</Run>

</TextBlock>

</Canvas>

Especificando Múltiples Fonts

No todos los fonts están disponibles en cada computador del usuario final. La propiedad FontFamily

soporta listar múltiples fonts (font fallback) cuando no está disponible el primer font. El font “Portale

User Interface” siempre está disponible en cada máquina, como parte de cómo Silverlight interactúa con

navegadores (browsers). El siguiente ejemplo muestra diferentes especificaciones de FontFamily.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<TextBlock FontFamily="Arial, Times New Roman"

Text="Hello World" FontSize="20"/>

<TextBlock FontFamily="Times New Roman, Arial" Canvas.Top="40"

Text="Hello World" FontSize="20"/>

<TextBlock FontFamily="Portable User Interface" Canvas.Top="80"

Text="Hello World" FontSize="20"/>

</Canvas>

Page 30: Introduccion silverlight

30

Page 31: Introduccion silverlight

31

Parte 8: Media (Audio y Video)

Silverlight provee un objeto MediaElement que Ud. puede utilizar para mostrar archivos WMV

(Windows Media Video) y WMA (Windows Media Audio), así como ciertos tipos de archivos MP3.

Este documento contiene las siguientes secciones.

- Adicione Media a su Página

- Propiedades útiles del MediaElement

- Controlando interactivamente el playback de la Media

- Playback de media a Pantalla Completa

- Pintando con Video

Adicionando Media a su Página

Para adicionar media a sus archivos, Ud. crea un MediaElement y establece su propiedad Source para que

referencie su archivo fuente de la Media, utilizando un camino (path) tipo URI. El siguiente es un

ejemplo.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<MediaElement

Source="SilverlightWithWebServices.wmv" Width="300" Height="300" />

</Canvas>

Page 32: Introduccion silverlight

32

Al igual que otros objetos UIElement, Ud. puede colocar dibujos encima de objetos MediaElement. El

siguiente ejemplo agrega una Ellipse enfrente del MediaElement del ejemplo previo.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<!-- <MediaElement

Source="SilverlightWithWebServices.wmv" Width="300" Height="300" />

-->

<Ellipse Height="200" Width="200" Canvas.Left="30" Canvas.Top="30"

Stroke="Black" StrokeThickness="10" Fill="SlateBlue"

Opacity="0.6" />

</Canvas>

Propiedades Utiles del MediaElement

En adición a las propiedades que el MediaElement recibe por ser un UIElement, tales como Opacity y

Clip, MediaElement provee varias propiedades específicas a Media.

- Stretch: Especifica cómo se estira el video para llenar el MediaElement. Los valores posibles

son: None, Uniform, UniformToFill y Fill. El valor por defecto es: Fill. Para mayor información

de la propiedad Stretch, vea el SDK Silverlight.

- IsMuted: Especifica si el MediaElemente está en “mute” (silenciado). Un valor de true silencia el

MediaElement. El valor por defecto es false.

- Volume: Especifica el volumen del audio del MediaElement como un valor de 0 a 1, con 1

siendo el de mayor volumen. El valor por defecto es 0.5.

Vea el Silverlight SDK para propiedades MediaElement adicionales.

Page 33: Introduccion silverlight

33

Controlando Interactivamente el Playback de la Media

Ud. puede controlar interactivamente el playback de la media utilizando los métodos Play, Pause y Stop.

El siguiente ejemplo usa los métodos Play, Pause y Stop para controlar interactivamente el playback de la

media.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<MediaElement x:Name="media"

Source="SilverlightWithWebServices.wmv"

Width="300" Height="300" />

<!-- Stops media playback.-->

<Canvas MouseLeftButtonDown="media_stop"

Canvas.Left="10" Canvas.Top="265">

<Rectangle Stroke="Black"

Height="30" Width="55" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Orange" Offset="0.0" />

<GradientStop Color="Red" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">stop</TextBlock>

</Canvas>

<!-- Pauses media playback. -->

<Canvas MouseLeftButtonDown="media_pause"

Canvas.Left="70" Canvas.Top="265">

<Rectangle Stroke="Black"

Height="30" Width="55" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Orange" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">pause</TextBlock>

</Canvas>

<!-- Begins media playback. -->

<Canvas MouseLeftButtonDown="media_begin"

Canvas.Left="130" Canvas.Top="265">

<Rectangle Stroke="Black" RadiusX="5" RadiusY="5"

Height="30" Width="55">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="LimeGreen" Offset="0.0" />

<GradientStop Color="Green" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">play</TextBlock>

</Canvas>

</Canvas>

Page 34: Introduccion silverlight

34

Código JavaScript

function media_stop(sender, args) {

sender.findName("media").stop();

}

function media_pause(sender, args) {

sender.findName("media").pause();

}

function media_begin(sender, args) {

sender.findName("media").play(); }

Playback de Media en Pantalla Completa (Full Screen)

Para playback del media en pantalla completa, establezca la propiedad FullScreen en true del plug-in

Silverlight anfitrión de su contenido, y ajuste el tamaño del MediaElement al ActualWidth y

ActualHeight reportado por el modelo de objetos de Silverlight.

El siguiente ejemplo adiciona playback de pantalla completa a los controles interactivos definidos en el

ejemplo previo.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Loaded="canvas_loaded">

<MediaElement x:Name="media"

Source="SilverlightWithWebServices.wmv"

Width="300" Height="300" />

<Canvas x:Name="buttonPanel">

<!-- Stops media playback.-->

<Canvas MouseLeftButtonDown="media_stop"

Canvas.Left="10" Canvas.Top="265">

<Rectangle Stroke="Black"

Height="30" Width="55" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Orange" Offset="0.0" />

<GradientStop Color="Red" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">stop</TextBlock>

</Canvas>

Page 35: Introduccion silverlight

35

<!-- Pauses media playback. -->

<Canvas MouseLeftButtonDown="media_pause"

Canvas.Left="70" Canvas.Top="265">

<Rectangle Stroke="Black"

Height="30" Width="55" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Orange" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">pause</TextBlock>

</Canvas>

<!-- Begins media playback. -->

<Canvas MouseLeftButtonDown="media_begin"

Canvas.Left="130" Canvas.Top="265">

<Rectangle Stroke="Black" RadiusX="5" RadiusY="5"

Height="30" Width="55">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="LimeGreen" Offset="0.0" />

<GradientStop Color="Green" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">play</TextBlock>

</Canvas>

<!-- Switches to full screen mode. -->

<Canvas MouseLeftButtonDown="toggle_fullScreen"

Canvas.Left="190" Canvas.Top="265">

<Rectangle Stroke="Black" RadiusX="5" RadiusY="5"

Height="30" Width="85">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Gray" Offset="0.0" />

<GradientStop Color="Black" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5"

Foreground="White" >full screen</TextBlock>

</Canvas>

</Canvas>

</Canvas>

Código JavaScript:

function media_stop(sender, args) {

sender.findName("media").stop();

}

function media_pause(sender, args) {

sender.findName("media").pause();

}

function media_begin(sender, args) {

sender.findName("media").play();

}

function canvas_loaded(sender, args)

{

var plugin = sender.getHost();

plugin.content.onfullScreenChange = onFullScreenChanged;

Page 36: Introduccion silverlight

36

}

function toggle_fullScreen(sender, args)

{

var silverlightPlugin = sender.getHost();

silverlightPlugin.content.fullScreen = !silverlightPlugin.content.fullScreen;

}

function onFullScreenChanged(sender, args)

{

var silverlightPlugin = sender.getHost();

var buttonPanel = sender.findName("buttonPanel");

if (silverlightPlugin.content.fullScreen == true)

{

buttonPanel.opacity = 0;

}

else

{

buttonPanel.opacity = 1;

}

var mediaPlayer = sender.findName("media");

mediaPlayer.width = silverlightPlugin.content.actualWidth;

mediaPlayer.height = silverlightPlugin.content.actualHeight;

}

Pintando con Video

Ud. puede utilizar un VideoBrush para pintar formas y texto con video. Para utilizar un VideoBrush, siga

estos pasos:

1. Cree un elemento VideoBrush

2. Cree un MediaElement y asígnele un nombre. El MediaElement procesa el flujo (stream) de

video para el VideoBrush. A menos que desee ver dos copias del video, Ud. deberá establecer la

Opacidad del MediaElement en 0.0. Si no desea audio (lo cual sería más común cuando usa un

video como brocha (brush)), establezca la propiedad IsMuted del MediaElement en true.

3. Establezca la propiedad SourceName del VideoBrush al nombre del MediaElement que acaba de

crear.

El siguiente ejemplo usa un VideoBrush para pinter el Foreground de un TextBlock.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<MediaElement x:Name="myMediaElement"

Source="SilverlightWithWebServices.wmv"

Width="300" Height="300"

Opacity="0" IsMuted="True" />

<TextBlock Canvas.Left="10" Canvas.Top="10"

FontFamily="Verdana"

FontSize="80" FontWeight="Bold">Watch<LineBreak/>This

<TextBlock.Foreground>

<VideoBrush SourceName="myMediaElement" />

</TextBlock.Foreground>

</TextBlock>

</Canvas>

Page 37: Introduccion silverlight

37

El parar (stop), pausar o correr (play) el MediaElement afecta al VideoBrush asociado, pero al cambiar el

tamaño o la opacidad del MediaElement no lo afecta. El mismo MediaElement puede utilizzarse por

múltiples objetos VideoBrush.

Page 38: Introduccion silverlight

38

Parte 9: Animaciones

Silverlight le permite utilizar markup paa definir animaciones.Este Quickstart introduce características de

animación de Silverlight y lo lleva por el proceso de creación de su primera animación Silverlight.

Este Quickstart contiene las siguientes secciones:

- Paso a paso: animar un objeto

o Paso 1: encontrar algo a animar

o Paso 2: crear un EventTrigger

o Paso 3: crear un Storyboard y una animación

- Otros tipos de animación

- Propiedades de Timelines

- Especificar valores de transición de animación

Paso a Paso: Animar un Objeto

Paso 1: Encuente algo a Animar

Primero, Ud. necesita algo a animar. Para este ejemplo, usaremos una Ellipse. El siguiente ejemplo crea

una Ellipse e inicialmente lo pinta de negro.

Note que la Ellipse tiene un nombre:

x:Name=”Ellipse”

La Ellipse necesita un nombre de forma que pueda ser animado. (Más específicamente, la Ellipse necesita

un nombre de forma que pueda ser localizado por una animación definida en otra parte del XAML Es el

destino o target de la animación). Ahora que Ud. tiene un objeto a animar, el siguiente paso es crear un

EventTrigger que comenzará la animación.

Paso 2: Crear un EventTrigger

Un EventTrigger (Disparador por Evento) lleva a cabo una acción cuando algo lo dispara. Como lo

implica su nombre, ese “algo” es un evento, especificado por la propiedad RoutedEvent. Debido a que

Ud. desea que el EventTrigger inicia una animación, use un BeginStoryboard como su acción.

También necesita decidir cuál evento va a disparar la animación. En Silverlight 1.0, es fácil decidir, pues

el objeto EventTigger sólo soporta un solo evento, el evento Loaded. Establezca la propiedad

RoutedEvent a Canvas.Loaded. Esto comenzará la animación cuando cargue el Canvas principal. El

siguiente ejemplo muestra el markup hasta ahora:

Page 39: Introduccion silverlight

39

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas.Triggers>

<EventTrigger RoutedEvent="Canvas.Loaded">

<EventTrigger.Actions>

<BeginStoryboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</Canvas.Triggers>

<Ellipse x:Name="ellipse"

Height="20" Width="20"

Canvas.Left="30" Canvas.Top="30"

Fill="Black" />

</Canvas>

Ahora está lista para crear un Storyboard y una animación

Paso 3: crear un Storyboard y una animación

Un Storyboard puede describir y controlar una o más animaciones. Para este ejemplo usaremos una sola

animación. En Silverlight, Ud. anima objetos aplicando animaciones a propiedades del objeto. Utilice una

DoubleAnimation para animar la propiedad Canvas.Left de la Ellipse. Ud. utiliza un DoubleAnimation

debido a que la propiedad animada, Canvas.Left, es de tipo Double (un número de punto flotante de doble

precisión).

Para que la animación opere, debe darle un nombre al que se va a aplicar

(Storyboard.TargetName=”ellipse”), una propiedad destino (Storyboard.TargetProperty=”(Canvas.Left)”,

un valor hacia el que se va a animar (To=”300”) y una duración (Duration=”0:0:1”). La propiedad

Duration especifica la longitud de tiempo que toma la animación para transicionar desde su valor inicial

hasta su valor final. Un valor de 0:0:1 especifica un Duration de un segundo.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas.Triggers>

<EventTrigger RoutedEvent="Canvas.Loaded">

<EventTrigger.Actions>

<BeginStoryboard>

<Storyboard>

<DoubleAnimation

Storyboard.TargetName="ellipse"

Storyboard.TargetProperty="(Canvas.Left)"

To="300" Duration="0:0:1" />

</Storyboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</Canvas.Triggers>

<Ellipse x:Name="ellipse"

Height="20" Width="20"

Canvas.Left="30" Canvas.Top="30"

Fill="Black" />

</Canvas>

Page 40: Introduccion silverlight

40

Otros Tipos de Animación

Silverlight también soporta animar colores (ColorAnimation) y puntos (PointAnimation). Cuando está

animando colores, recuerde que “color” es diferente de “SolidColorBrush”. El primero es una propiedad

del segundo. Cuando Ud. especifica un nombre de color o valor hexadecimal para establecer propiedades

de Stroke y Fill de un Shape, en realidad Silverlight convierte esa cadena de caracteres a un

SolidColorBrush automáticamente. Si quiere animar un Stroke o Fill, recomendamos usar la sintaxis más

verbosa, en donde declara un Brush (brocha) explícitamente y le da la oportunidad de darle un nombre al

Brush directamente.

El siguiente ejemplo anima el color de dos Ellipses. El Fill de la primera Ellipse fue especificado

explicitamente con un SolidColorBrush. El ejemplo le da un nombre al SolidColorBrush y anima su

propiedad Color. La segunda animación es más compleja, ya que el Fill será establecido con un nombre

de color. Cuando corra el markup, el sistema creará un SolidColorBrush del color apropiado y lo utilizará

para pintar la Ellipse. Debido a que carecemos de un tag <SolidColorBrush> al que podamos nombrar, el

SolidColorBrush generado automáticamente por el sistema sólo puede animarse con una propiedad

destino al que llegamos indirectamente.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas.Triggers>

<EventTrigger RoutedEvent="Canvas.Loaded">

<EventTrigger.Actions>

<BeginStoryboard>

<Storyboard>

<ColorAnimation

Storyboard.TargetName="e1_brush"

Storyboard.TargetProperty="Color"

From="Red" To="Blue" Duration="0:0:5" />

<ColorAnimation

Storyboard.TargetName="e2"

Storyboard.TargetProperty="(Fill).(Color)"

From="Red" To="Blue" Duration="0:0:5" />

</Storyboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</Canvas.Triggers>

<Ellipse

Height="100" Width="100" Canvas.Left="30" Canvas.Top="30">

<Ellipse.Fill>

<SolidColorBrush x:Name="e1_brush" Color="black"/>

</Ellipse.Fill>

</Ellipse>

<Ellipse x:Name="e2" Fill="Black"

Height="100" Width="100" Canvas.Left="30" Canvas.Top="130"/>

</Canvas>

Page 41: Introduccion silverlight

41

Tanto Storyboard y DoubleAnimation son tipos del objeto Timeline. Los Timelines tienen varias

propiedades útiles:

- Storyboard.TargetName: el nombre del objeto que está animando. Si no especifica un

Storyboard.Targetname, el timeline utiliza el de su padre. Si no especifica el

Storyboard.TargetName en ninguno de los padres, el timeline se enfoca en el elemento que es

dueño del EventTrigger disparado.

- Storyboard.TargetProperty: La propiedad que está animando. Si lo omite, usa el de su padre. La

sintaxis de esta propiedad varía, dependiendo del tipo de propiedad animado:

o Para enfocarse en un “attached property”, use la siguiente sintaxis:

“(ownerType.propertyName)”. Por ejemplo “(Canvas.Top)” enfoca la propiedad

Canvas.Top.

o Para enfocar cualquier otro tipo de propiedad, utilice la sintaxis: “propertyName”. Por

ejemplo, “Opacity” (sin paréntesis) enfoca la propiedad Opacity.

- BeginTime: El tiempo en que el timeline debe comenzar. Recuerde que la unidad por defecto es

días, así que tenga cuidado – si especifica “2” implica 2 días. Use la siguiente sintaxis paa

especificar horas, minutos y segundos: horas:minutos:segundos. Por ejemplo, “0:0:2” para 2

segundos. Si no especifica BeginTime, el valor por defecto es 0 segundos.

- Duration: La longitud de tiempo que corre una pasada de la animación (más tarde hay otra

propiedad para repetir las pasadas). Usa la misma sintaxis que BeginTime, por lo que debe tener

cuidado si utiliza valores como 2, que significa: 2 días. Duration también tiene los valores

especiales “Forever” y “Automatic”. El valor por default es “Automatic”.

- FillBehaviour: Cómo debe comportarse un timeline cuando termina. Esta propiedad puede tomar

uno de dos valores: “Stop” o “HoldEnd”. “Stop” reotrna el valor de la propiedad al valor inicial,

antes de que comenzara la animación. “HoldEnd” toma el valor final de la animación. El valor

por defecto es “HoldEnd”.

- RepeatBehaviour: Indica cuántas veces debe correr el TimeLine. Esta propiedad puede tomar

tres tipos de valores: un conteo de iteraciones, un valor de tiempo, o el valor especial Forever.

- “Forever” hace que el timeline repita indefinidamente.

- Un tiempo finito hace que el timeline corre por el tiempo especificado. Por ejemplo, al

establecer un RepeatBehaviour de “0:0:5” en una animación con Duration de 2.5 segundos,

le da tiempo para repetir la animación dos veces.

- Un valor de iteración hace que el timeline corra por el número especificado de iteraciones.

Ud. expresa valores de iteración con la sintaxis: iterationCountx. Por ejemplo, un valor de

“4x” repite el timeline cuatro veces. El valor por defecto es “1x”, que corre sólo una vez.

Page 42: Introduccion silverlight

42

El siguiente ejemplo demuestra estas propiedades de timeline.

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas.Triggers>

<EventTrigger RoutedEvent="Canvas.Loaded">

<EventTrigger.Actions>

<BeginStoryboard>

<Storyboard

Storyboard.TargetName="e1"

Storyboard.TargetProperty="(Canvas.Left)"

BeginTime="0:0:1">

<DoubleAnimation To="300" />

<DoubleAnimation To="300" Storyboard.TargetName="e2"/>

<DoubleAnimation To="80" Storyboard.TargetName="e3"

Storyboard.TargetProperty="Width" />

<DoubleAnimation From="200" To="300" Storyboard.TargetName="e4"/>

<DoubleAnimation To="300" Duration="0:0:5.3"

Storyboard.TargetName="e5"/>

<DoubleAnimation FillBehavior="HoldEnd" To="200"

Storyboard.TargetName="e6"/>

<DoubleAnimation FillBehavior="Stop" To="200"

Storyboard.TargetName="e7"/>

<DoubleAnimation RepeatBehavior="Forever" To="300"

Storyboard.TargetName="e8"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</Canvas.Triggers>

<Ellipse x:Name="e1" Fill="Black"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="30"/>

<TextBlock Canvas.Left="0" Canvas.Top="30">e1</TextBlock>

<Ellipse x:Name="e2" Fill="Red"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="50"/>

<TextBlock Canvas.Left="0" Canvas.Top="50" Foreground="Red">e2</TextBlock>

<Ellipse x:Name="e3" Fill="Purple"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="70"/>

<TextBlock Canvas.Left="0" Canvas.Top="70" Foreground="Purple">e3</TextBlock>

<Ellipse x:Name="e4" Fill="Blue"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="90"/>

<TextBlock Canvas.Left="0" Canvas.Top="90" Foreground="Blue">e4</TextBlock>

<Ellipse x:Name="e5" Fill="Green"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="110"/>

<TextBlock Canvas.Left="0" Canvas.Top="110" Foreground="Green">e5</TextBlock>

<Ellipse x:Name="e6" Fill="Black"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="130"/>

<TextBlock Canvas.Left="0" Canvas.Top="130" Foreground="Black">e6</TextBlock>

<Ellipse x:Name="e7" Fill="Orange"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="150"/>

<TextBlock Canvas.Left="0" Canvas.Top="150" Foreground="Orange">e7</TextBlock>

<Ellipse x:Name="e8" Fill="Red"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="170"/>

<TextBlock Canvas.Left="0" Canvas.Top="170" Foreground="Red">e8</TextBlock>

</Canvas>

Page 43: Introduccion silverlight

43

Especifique Valores de Transicion de la Animación

DoubleAnimation, ColorAnimation, y PointAnimation tienen propiedades From y To que especifican los

valores de inicio y final de la propiedad animada. Si no especifica el From, usará el valor actual de la

propiedad como valor inicial de la animación. En vez de especificar un valor final con la propiedad To,

Ud. puede utilizar una propiedad By paa establecer un valor de offset.

Page 44: Introduccion silverlight

44

Parte 10: Scripting y Eventos del Ratón

Silverlight 1.0 soporta programación en JavaScript, que le permite darle interactividad a su contenido.

Esta parte contiene las siguientes secciones:

- scripting y eventos

- estableciendo propiedades

- estableciendo “attached properties”

- eventos comunes del ratón

- nombrando objetos y recobrándolos

- creando objetos dinámicamente con Silverlight

- creando objetos dinámicamente con Silverlight, con manipulación de cadenas XAML

- controlando animaciones interactivamente

- usando el método getElementById

Scripting y Eventos

Silverlight le permite correr código JavaScript cuando ocurre un evento, como cuando un objeto es

cargado o el ratón entra en un objeto. Tales scripts son llamados “event handler” (manejadores de

evento).

Para definir un event handler, siga estos pasos:

1. En su archivo XAML, agregue el siguiente atributo al objeto que disparará su función.

someEvent=”myFunction”

… donde someEvent es el evento al cual desea responder, y myFunction es el nombre de la

función que manejará el evento.

2. Defina la función en su archivo JavaScript.

Ahora probaremos un ejemplo. En Silverlight, todos los elementos Canvas y Shapes tienen un evento

llamado MouseLeftButtonDown que ocurre cuando el usuario oprime el botón izquierdo cuando el cursor

está sobre ese elemento. Ud. escribirá un manejador de eventos para dicho evento, que llamará a la

función de JavaScript alert para crear una caja de diálogo.

El archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

MouseLeftButtonDown="helloworld">

<TextBlock Text="click me" FontSize="50"/>

</Canvas>

Page 45: Introduccion silverlight

45

El archivo default.htm podría contener la función helloworld():

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

<title>A Sample HTML page</title>

<script type="text/javascript" src="Silverlight.js"></script>

<script type="text/javascript" src="createSilverlight.js"></script>

<script type="text/javascript" src="my-script.js"></script>

</head>

<body>

<!—Lugar donde va el Plug-In Silverlight -->

<div id="mySilverlightPluginHost">

</div>

<script type="text/javascript">

// Recobra el elemento div que Ud. creó en el paso previo

var parentElement =

document.getElementById("mySilverlightPluginHost");

// Esta función crea el Plug-In Silverlight.

createMySilverlightPlugin();

function helloworld() {

alert("hello world");

}

</script>

</body>

</html>

O bien, colocamos la función helloworld() en un archivo Javascript externo my-script.js que hemos

referenciado en la sección <head>:

function helloworld() {

alert("hello world");

}

Ud. no necesita especificar parámetros cuando declara una función manejadora de eventos (event handler

function). Pero si especifica parámetros, deben ser dos: el primer parámetro, sender, es el elemento que

envía el evento. El segundo parámetro, args, es un objeto que contiene datos sobre el evento. Sin

embargo, no todos los eventos transmiten información específica al evento en args; muchas veces el valor

de dicho parámetro es null y no es útil para su manejador de evento.

Page 46: Introduccion silverlight

46

Estableciendo propiedades

Ud. puede establecer propiedades de los objetos Silverlight utilizando JavaScript. Cuando una propiedad

toma un valor que es una cadena o un número, lo puede establecer de manera normal con JavaScript. Si la

propiedad toma un objeto Silverlight, y tiene un convertidor de tipo, tales como SolidColorBrush o Point,

Ud. puede establecer el valor usando una cadena (string). De otra forma, Ud. necesitará usar el método

createFromXaml para instanciar un nuevo valor de propiedad.

El siguiente ejemplo se registra para el evento MouseLeftButtonDown de un Canvas. En el manejador de

evento (event handler) el parámetro sender provee acceso al Canvas. El ejemplo establece la propiedad

Background del Canvas a rojo, y muestra el valor actual de su propiedad Height.

Archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="300" Height="300"

MouseLeftButtonDown="changecolor">

<TextBlock Text="click me" FontSize="50"/>

</Canvas>

Archivo my-script.js:

function changecolor(sender, args) {

sender.background = "red";

alert("Altura es " + sender.Height);

}

Estableciendo “attached properties”

Para establecer el valor de una “attached property” (como, por ejemplo, Canvas.Top), en JavaScript,

utilice la siguiente sintaxis:

Object[“attachedPropertyName”]=value;

… en donde attachedPropertyName es el nombre de la propiedad adjuntada que desea establecer.

Page 47: Introduccion silverlight

47

El siguiente ejemplo establece la propiedad Canvas.Top de un TextBlock con el valor 70, al oprimir el

botón izquierdo del ratón.

Archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="300" Height="300">

<TextBlock Text="click me" FontSize="50"

MouseLeftButtonDown="changelocation" />

</Canvas>

Archivo my-script.js:

function changelocation(sender, args) {

sender["Canvas.Top"] = 70;

}

Eventos comunes del ratón

Los objetos UIElemento proveen una cantidad de eventos de ratón diferentes, los cuales puede manejar:

MouseLeftButtonDown, MouseLeftButtonUp, MouseEnter (disparado – raised – cuando el ratón pasa

sobre el elemento, MouseLeave y MouseMove (disparado cuando el ratón es movido dentro del

elemento). Los eventos Mouse tienen un objeto “args” que provee las posiciones “x” y “y” del ratón al

momento de ocurrir el evento. Ud. puede referenciarlos en los manejadores de los eventos del ratón.

Page 48: Introduccion silverlight

48

El siguiente ejemplo utilica cada uno de los eventos del ratón para modificar la apariencia de una Ellipse.

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Ellipse x:Name="e1" MouseMove="e1Move"

MouseEnter="e1Enter" MouseLeave="e1Leave"

MouseLeftButtonDown="e1Down" MouseLeftButtonUp="e1Up"

Height="100" Width="100" Canvas.Left="80" Canvas.Top="30"

Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>

</Canvas>

En el archivo my-script.js:

function e1Enter(sender, args) {

sender.stroke = "red";

}

function e1Leave(sender, args) {

sender.stroke = "black";

}

function e1Down(sender, args) {

sender.fill = "Green";

}

function e1Up(sender, args) {

sender.fill = "LightBlue";

}

function e1Move(sender, args) {

sender.fill = "yellow";

}

Otro útil evento en la programación Silverlight es el evento Loaded. Usualmente Ud. registra

manejadores (handlers) para este evento con una declaración en el elemento raíz (root), aunque puede

especificarse en cualquier UIElement, no sólo en el raíz. El evento Loaded provee una buena oportunidad

para aplicar cambios de último minuto cuando despliega el contenido Silverlight. El siguiente ejemplo usa

un evento Loaded para cambiar el Fill de una Ellipse de Blue a Red.

Page 49: Introduccion silverlight

49

Nombrando Objetos y Recobrándolos

Los ejemplos anteriores usaban manejadores de evento (event handlers) JavaScript para modificar el

objeto que disparó el evento, pero qué sucede si desea usar métodos o establecer propiedades de un objeto

distinto al sender? Los elementos silverlight proveen un método llamado FindName que le permiten

recuperar objetos Silverlight desde cualquier marco de referencia dentro del contenido Silverlight. Para

utilizar FindName para recuperar un objeto, Ud. debe primero especificar el atributo x:Name (o el

atributo/propiedad Name, que es esencialmente equivalente) para darle al objeto un nombre cuando lo

declara en XAML.

El siguiente ejemplo cambia la propiedad Fill de una Ellipse cuando el botón izquierdo es presionado

sobre el Canvas padre. Cuando el Canvas dispara el evento, la función changeEllipseColor es llamado con

Canvas como sender. La función llama a sender.findName para recuperar el objeto llamado myEllipse y

establecer su propiedad Fill a Red (rojo).

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

MouseLeftButtonDown="changeEllipseColor">

<TextBlock Text="click me" FontSize="50"/>

<Ellipse x:Name="myEllipse"

Height="200" Width="200"

Canvas.Left="30" Canvas.Top="80"

Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>

</Canvas>

En el archivo my-script.js:

function changeEllipseColor(sender, args) {

sender.findName("myEllipse").Fill = "red";

}

Page 50: Introduccion silverlight

50

Creando objetos dinámicamente con Silverlight

Ud. puede usar el método CreateFromXaml para crear nuevos objetos Silverlight desde JavaScript. Pero

antes de poder utilizar el método CreateFrom Xaml, debe obtener una referencia a la instancia del Plug-In

Silverlight.

- Si Ud. ya tiene una referencia a cualquier objeto Silverlight, Ud. puede utilizar el método

GetHost para retornar una referencia a la instancia de Plug-In anfitrión.

- De otra forma, utilice el método document.getElementById para recuperar la instancia de plug-

in.

El siguiente ejemplo crea un nuevo objeto Ellipse y lo adiciona al Canvas cada vez que oprime el botón

izquierdo del ratón. Note que a pesar de que está adicionando múltiples objetos si Ud. da click más de una

vez, sólo verá una Ellipse. Esto es porque todas las Ellipses se ven igual, y están en el mismo lugar, una

encima del otro.

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

MouseLeftButtonDown="createEllipse">

<TextBlock Text="click for circle" FontSize="40"/>

</Canvas>

Y en el archivo my-script.js:

function createEllipse(sender, args) {

var slControl = sender.getHost();

var e =

slControl.content.createFromXaml(

'<Ellipse Height="200" Width="200" Fill="Blue"/>');

var canvas = sender;

canvas.children.Add(e);

}

Note que JavaScript requiere que las cadenas de caracteres quepan en una sola línea, a menos que

combine múltiples cadenas con el operador +. También note el uso de tanto comillas simples („)

ycomillas dobles (“) en la cadena XAML <Ellipse>. El comenzar y finalizar la cadena de JavaScript con

comillas simples le permite utilizar doble comillas para los valores en la cadena XAML, o viceversa. Sólo

asegúrese de que las comillas simples o dobles estén emparejadas y balanceadas.

Page 51: Introduccion silverlight

51

Creando objetos dinámicamente con Silverlight, con manipulación de cadenas XAML

El previo ejemplo mostró un potencialmente efecto secundario no deseado de adicionar el mismo XAML

a la página más de una vez. Si Ud. desea adicionar objetos con XAML, es frecuentemente deseable

cambiar el XAML en algo cada vez. Ud. puede hacer esto ajustando la cadena XAML inmediatamente

antes de cada llamada.

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

MouseLeftButtonDown="createEllipse2">

<TextBlock Text="click for Lots of circles" FontSize="20"/>

</Canvas>

En el archivo my-script.js:

var opacitychange = 1;

var canvastop = 0;

var canvasleft = 0;

function createEllipse2(sender, args) {

var slControl = sender.getHost();

xamlstring = '<Ellipse Height="10" Width="10" Fill="Red"';

xamlstring += " Opacity = '" + (opacitychange-=0.1) + "'";

xamlstring += " Canvas.Left = '" + (canvasleft+=15) + "'";

xamlstring += " Canvas.Top = '" + (canvastop+=15) + "'";

xamlstring += "/>";

var e = slControl.content.createFromXaml(xamlstring);

var canvas = sender;

canvas.children.Add(e);

}

Controlando animaciones interactivamente

Ud. puede utilizar manejadores de eventos (event handlers) para controlar animaciones. Asigne un

nombre al Storyboard que Ud. desea controlar y luego puede utilizar sus métodos Begin, Stop, Pause y

Resume para controlarlo interactivamente. Si no desea que el Storyboard comience automáticamente,

declárelo como un Resource (recurso) en vez de declararlo dentro de un EventTrigger.

Page 52: Introduccion silverlight

52

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

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

<Canvas.Resources>

<Storyboard x:Name="animation"

Storyboard.TargetName="e1"

Storyboard.TargetProperty="(Canvas.Left)">

<DoubleAnimation RepeatBehavior="Forever" To="300"/>

</Storyboard>

</Canvas.Resources>

<Ellipse x:Name="e1"

Height="20" Width="20" Canvas.Left="30" Canvas.Top="30">

<Ellipse.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="White" Offset="0.0" />

<GradientStop Color="Black" Offset="0.5" />

</RadialGradientBrush>

</Ellipse.Fill>

</Ellipse>

<Canvas MouseLeftButtonDown="animation_stop" Canvas.Left="20" Canvas.Top="60">

<Rectangle Stroke="Black"

Height="40" Width="40" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Orange" Offset="0.0" />

<GradientStop Color="Red" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">stop</TextBlock>

</Canvas>

<Canvas MouseLeftButtonDown="animation_pause"

Canvas.Left="70" Canvas.Top="60">

<Rectangle Stroke="Black"

Height="40" Width="50" RadiusX="5" RadiusY="5">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="Yellow" Offset="0.0" />

<GradientStop Color="Orange" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">pause</TextBlock>

</Canvas>

<Canvas MouseLeftButtonDown="animation_begin" Canvas.Left="130"

Canvas.Top="60">

<Rectangle Stroke="Black" RadiusX="5" RadiusY="5"

Height="40" Width="50">

<Rectangle.Fill>

<RadialGradientBrush GradientOrigin="0.75,0.25">

<GradientStop Color="LimeGreen" Offset="0.0" />

<GradientStop Color="Green" Offset="1.0" />

</RadialGradientBrush>

</Rectangle.Fill>

</Rectangle>

<TextBlock Canvas.Left="5" Canvas.Top="5">begin</TextBlock>

</Canvas>

</Canvas>

Page 53: Introduccion silverlight

53

En el archivo my-script.js:

function animation_stop(sender, args) {

sender.findName("animation").stop();

}

function animation_pause(sender, args) {

sender.findName("animation").pause();

}

function animation_begin(sender, args) {

sender.findName("animation").begin();

}

Usando el método getElementById

Cuando está escribiendo script que no es disparado por un evento Silverlight (tales como el manejador de

eventos HTML), Ud. no tendrá un parámetro Sender que pueda proveer acceso a los métodos FindName

o GetHost. En este caso, Ud. puede usar document.getElementById() para encontrar el plug-in

Silverlight, y luego utilizar el objeto Plug-In Silverlight para llamar al método FindName.

El siguiente ejemplo usa el método document.getElementById() para encontrar la instancia del Plug-In

Silverlight con nombre mySilverlightPlugin. Luego utiliza el método FindName para recuperar la

instancia de Ellipse llamada myEllipse y cambia su propiedad Fill a red (rojo).

En el archivo myxaml.xaml:

<Canvas

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

MouseLeftButtonDown="changeEllipseColor2">

<TextBlock Text="click me" FontSize="50"/>

<Ellipse x:Name="myEllipse"

Height="200" Width="200"

Canvas.Left="30" Canvas.Top="80"

Stroke="Black" StrokeThickness="10" Fill="LightBlue"/>

</Canvas>

En el archivo my-script.js:

function changeEllipseColor2() {

var varPlugIn = document.getElementById("mySilverlightPlugin");

varPlugIn.content.findName("myEllipse").fill = "red";

}

Page 54: Introduccion silverlight

54

En el ejemplo anterior, mySilverlightPlugIn es el DOM ID de HTML de la instancia de Plug-In

Silverlight que creó en su archivo HTML anfitrión, cuando llamó al Silverlight.createObject, como se

describe en la primera parte de este documento.

Para referencia, en el archivo HTML default.htm, Ud. tiene lo siguiente:

<!DOCTYPE html PUBLIC

"-//W3C//DTD XHTML 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">

<head>

<title>A Sample HTML page</title>

<script type="text/javascript" src="Silverlight.js"></script>

<script type="text/javascript" src="createSilverlight.js"></script>

<script type="text/javascript" src="my-script.js"></script>

</head>

<body>

<!—Lugar donde va el Plug-In Silverlight -->

<div id="mySilverlightPluginHost">

</div>

<script type="text/javascript">

// Recobra el elemento div que Ud. creó en el paso previo

var parentElement =

document.getElementById("mySilverlightPluginHost");

// Esta función crea el Plug-In Silverlight.

createMySilverlightPlugin();

</script>

</body>

</html>

En el archivo createSilverlight.js, tiene:

function createMySilverlightPlugin()

{

Silverlight.createObject(

"myxaml.xaml", // Valor de Propiedad Source.

parentElement, // Referencia DOM a DIV tag hosteador.

"mySilverlightPlugin", // Valor de ID del plug-in.

{ // Propiedades por cada instancia.

width:'300', // Ancho del plug-in en pixels.

height:'300', // Altura del plug-in en pixels.

inplaceInstallPrompt:false, // Determina si desplegar prompt

// para instalar in-place

// si detecta versión inválida.

background:'#D6D6D6', // Color del fondo del plug-in.

isWindowless:'false', // Determina si mostrar plug-in

// en modo Windowless.

framerate:'24', // Valor propiedad MaxFrameRate.

version:'1.0' // Versión de Silverlight a usar.

},

{

onError:null, // Valor propiedad OnError --

// nombre función del event handler.

onLoad:null // Valor propiedad OnLoad --

// nombre función del event handler.

},

null); // Valor Contexto – event handler.

}

Page 55: Introduccion silverlight

55

Page 56: Introduccion silverlight

56

Parte 11: Ejemplo de Controles

Esta pate contiene ejemplos que muestran cómo utilizar Silverlight para crear controles interactivos.

Esta parte contiene las siguientes secciones:

- Ejemplo de hyperlink

- Ejemplo de botón

- Ejemplo de Slider

Ejemplo de Hyperlink

El siguiente ejemplo crea un hyperlink a partir de un TextBlock y una Line.

Archivo myxaml.xaml:

<Canvas Width="300" Height="300"

xmlns="http://schemas.microsoft.com/client/2007"

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

<!-- Hyperlink -->

<Canvas Width="90" Height="30" Canvas.Left="20" Canvas.Top="20"

Background="transparent"

Cursor="Hand"

MouseEnter="hyperlink_MouseEnter"

MouseLeave="hyperlink_MouseLeave"

MouseLeftButtonDown="hyperlink_MouseLeftButtonDown">

<TextBlock Text="hyperlink" Foreground="Blue"/>

<Line Stroke="blue" StrokeThickness="1"

X1="0" Y1="20" X2="65" Y2="20"

x:Name="hyperlink_line" Opacity="0"/>

</Canvas>

</Canvas>

Archivo my-script.js:

function hyperlink_MouseLeftButtonDown(sender, args) {

window.location = "about-frames.html";

}

function hyperlink_MouseEnter(sender,args)

{

sender.findName("hyperlink_line").opacity = 1;

}

function hyperlink_MouseLeave(sender,args)

{

sender.findName("hyperlink_line").opacity = 0;

}

Page 57: Introduccion silverlight

57

Nota: hay una forma alternativa más conveniente de crear un hyperlink. Ver documentación de la

propiedad TextDecorations del objeto TextBlock en el SDK Silverlight.

Ejemplo de Botón

El siguiente ejemplo crea un botón a partir de dos elementos Rectangle y un TextBlock.

Archivo myxaml.xaml:

<Canvas Width="300" Height="300"

xmlns="http://schemas.microsoft.com/client/2007"

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

<!-- Button -->

<Canvas

x:Name="button"

Canvas.Top="10" Canvas.Left="20"

MouseLeftButtonDown="button_MouseLeftButtonDown"

MouseLeftButtonUp="button_MouseLeftButtonUp"

MouseEnter="button_MouseEnter"

MouseLeave="button_MouseLeave">

<Canvas.RenderTransform>

<TransformGroup>

<TranslateTransform x:Name="button_transform" X="0" Y="0"/>

</TransformGroup>

</Canvas.RenderTransform>

<Rectangle

Stroke="#FF000000"

Fill="sc#1, 0.8123474, 0.8123474, 0.8123474"

Width="128.8" Height="56"

x:Name="button_rectangle"/>

<Rectangle

Stroke="sc#1, 0.912730157, 0.37122494, 0.17111966"

StrokeThickness="5"

Width="126.8" Height="54"

Canvas.Left="1" Canvas.Top="1"

Opacity="0"

x:Name="button_highlight"/>

<TextBlock Text="Presione!" FontSize="20" Canvas.Left="22" Canvas.Top="12"/>

</Canvas>

</Canvas>

Page 58: Introduccion silverlight

58

Archivo my-script.js:

var mouseOver = false;

var pressed = false;

function button_MouseLeftButtonDown(sender,args) {

sender.captureMouse();

mouseOver = true;

pressed = true;

updateVisuals(sender);

}

function button_MouseLeftButtonUp(sender,args) {

sender.releaseMouseCapture();

pressed = false;

updateVisuals(sender);

if (mouseOver) {

alert("you pressed the button!");

}

}

function button_MouseEnter(sender,args) {

mouseOver = true;

updateVisuals(sender);

}

function button_MouseLeave(sender,args) {

mouseOver = false;

updateVisuals(sender);

}

function updateVisuals(sender) {

//background

if (pressed && mouseOver) {

sender.findName("button_rectangle").fill =

"sc#1, 0.548430264, 0.5354195, 0.5354195";

var transform = sender.findName("button_transform");

transform.x = 2;

transform.y = 2;

} else {

sender.findName("button_rectangle").fill =

"sc#1, 0.8123474, 0.8123474, 0.8123474";

var transform = sender.findName("button_transform");

transform.x = 0;

transform.y = 0;

}

// highlight

if (mouseOver || pressed) {

sender.findName("button_highlight").opacity = 1;

} else {

sender.findName("button_highlight").opacity = 0;

}

}

Page 59: Introduccion silverlight

59

Ejemplo de Slider

El siguiente ejemplo crea un Slider a partir de un Line y un Path.

Archivo myxaml.xaml:

<Canvas Width="300" Height="300"

xmlns="http://schemas.microsoft.com/client/2007"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Loaded="slider_Loaded">

<!-- Slider -->

<Canvas x:Name="slider"

Canvas.Top="50" Canvas.Left="20"

Width="200" Height="45"

Background="transparent">

<Line x:Name="slider_line"

Stroke="black" StrokeThickness="1"

X1="0" Y1="25" X2="200" Y2="25" />

<Rectangle

Fill="Transparent"

Width="200" Height="45"

MouseLeftButtonDown="slider_MouseLeftButtonDown" />

<Path x:Name="slider_thumb" Stroke="#FF000000"

Fill="sc#1, 0.548430264, 0.5354195, 0.5354195"

Data="M0,0 L11.5,0 11.5,30 5.75,40 0,30z"

MouseLeftButtonUp="slider_thumb_MouseLeftButtonUp"

MouseMove="slider_thumb_MouseMove"

MouseLeftButtonDown="slider_thumb_MouseLeftButtonDown" />

</Canvas>

</Canvas>

Archivo my-script.js:

var mouseDownPosition = 0;

var mouseDownValue = -1;

var thumbCenter = 5.75;

function slider_Loaded(sender, args) {

slider_SetValue(sender, 0);

}

function slider_MouseLeftButtonDown(sender, args) {

var coordinate = args.getPosition(null).x;

var slider = sender.findName("slider");

coordinate -= slider["Canvas.Left"];

slider_SetValue(slider, coordinate - thumbCenter);

}

function slider_thumb_MouseLeftButtonDown(sender, args) {

var slider = sender.findName("slider");

sender.captureMouse();

mouseDownValue = slider_GetValue(slider);

mouseDownPosition = args.getPosition(null).x;

}

function slider_thumb_MouseLeftButtonUp(sender, args) {

var slider = sender.findName("slider");

slider.releaseMouseCapture();

mouseDownValue = -1;

}

Page 60: Introduccion silverlight

60

function slider_thumb_MouseMove(sender, args) {

var slider = sender.findName("slider");

if (mouseDownValue != -1) {

var newValue = mouseDownValue + (args.getPosition(null).x -

mouseDownPosition);

slider_SetValue(slider, newValue);

}

}

function slider_GetValue(sender) {

var thumb = sender.findName("slider_thumb");

return thumb["Canvas.Left"];

}

function slider_SetValue(sender, newValue) {

if (newValue > sender.width ) {

newValue = sender.width;

mouseDownValue = -1;

}

if (newValue < - thumbCenter) {

newValue = - thumbCenter;

mouseDownValue = -1;

}

var thumb = sender.findName("slider_thumb");

thumb["Canvas.Left"] = newValue;

}