[Eventos] Introducción a Silverlight – Instituto Virginio Gómez

logo


En el  Instituto Virginio Gómez (http://www.virginiogomez. cl/index.php?modulo=sedes&opcion=concepcion)  realizaré un ciclo de charlas sobre Silverlight, terminando con un Hand on Labs para aplicar lo visto.


Lunes 7 de Abril  – 19:00hrs
Introducción a Silverlight
El objetivo es conocer la nueva tecnología de Microsoft para el diseño de interfaces  web ricas en contenido. Revisaremos como crear animaciones sencillas utilizando Visual Studio 2008 y Microsoft Expression Blend.

Lunes 21 de Abril- 19:00hrs
Silverlight:Animaciones, contenido multimedia y Javascript
Revisaremos
cómo crear animaciones, exponer contenido multimedia y  responder a la interacción del usuario mediante javascript.

Lunes 5 de Mayo- 19:00hrs
Introducción a Silverlight 2.0
Construcción de Aplicaciones utilizando Silverlight y código manejado. Incluyendo funcionalidad de la BCL y soporte para LINQ e integración de la API DOM de HTML enriquecido

Lunes 12 de Mayo- 19:00hrs
Hand on Labs de Silverlight
Para poner en práctica las principales características que revisamos durante el ciclo de charlas.

Saludos!

Gonzalo

[Tips] Como acceder a un WebControl dentro de un HeaderTemplate de un Wizard.

Aunque algunos puedan decir que esto es básico, el que se pregunte a menudo es por que hay necesidad de saber, y considerando que la mayoría  de los post que tengo en el blogs son de  usuarios que buscan algún tip, es que es por ello que en esta sección postearé cosas simples, pero que son consultadas a menudo.

Paso 1
Agregamos el control wizard en nuestra página.

image

Paso 2
Agregamos un label en el headertemplate.

image

Paso 3
Agregamos el código:

 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim lb As New Label
        lb = CType(Me.Wizard1.FindControl(«HeaderContainer$label1»), Label)
        lb.Text = «I see drunk people…»
End Sub

Resultado

image

Cual es la diferencia con la búsqueda (FindControl) al cual estamos acostumbrados, es que debemos ocupar HeaderContainer$ que hace referencia al template que estamos utilizando :);Seguramente probaste sin HeaderContainer$ y no funcionó verdad?. Espero que te sirva, continuo con más Tips en breve.

PD: También ven drunk people…??
PD: Cerveza Favorita : Kunstmann Torobayo

Saludos,
Gonzalo

[Off-Topic] Señor vendedor "Especializado" en Notebooks..por favor… cállese!

O como dijo el rey de España «Por que no te callas??», eso me sucedió ayer, cuando acompañe a mi hermano a comprar una portátil a una gran tienda comercial, en donde atienden especialistas en el tema. No es que yo sea el más erudito el hardware pero uno algo sabe, aun así nada hacia presagiar lo que venia.

Mucha oferta de portátiles, pero íbamos con algunas especificaciones en mente, core 2 duo y 2gb en ram, .., y ahí comenzó la odisea.

«Para que quiere 2 Gb , si yo(vendedor) tengo un notebook con 512 ram y anda súper bien» , a lo que conteste, súper bien para que? y me dijo «para navegar poh’, ahhh, le dije, nosotros necesitamos más ram por el sw que vamos a utilizar y no me entendió.

Nos dijo con voz de «sin más remedio» , «estos equipos vienen con vista», le pregunté que versión de Windows Vista?… me dijo «la única que hay, la que dice vista» y se rió como diciendo que yo no sabia de lo que estaba hablando.

Para estar seguro de que el equipo cumplía con algunas características deseables, fui a la pantalla de Evaluación de la Experiencia en Windows para ver la puntuación.

(La imagen siguiente es la puntuación de mi portátil)

image 

El equipo en cuestión marcaba 2,0 como sabemos, se determina por la puntuación más baja, que casi siempre tiene que ver con los gráficos, así se lo hice saber a mi hermano y el vendedor nos dice

«nooo están equivocados, es que yo estuve jugando y es el puntaje que obtuve, jajajja»

El tipo se reía a carcajadas  de mi ignorancia, a sí que le dije «explicanos tu por favor, no nos prives de tu sabiduría» y se quedo callado, luego le explique a mi hermano en que consistían esos números, luego, llegó otro vendedor y me dijo:

«Eso de lo que esta hablando no es cierto, ¿por que en los equipos aparecen valores distintos? además es primera vez que veo esa pantalla, si fuera tan importante aparecería a cada rato»

Ya era demasiado, no sabia si reír, reclamar a un supervisor ya que la frase «consulte a nuestros expertos» se había esfumado totalmente. Pensaba en toda la gente que va a comprar un portátil (en mi país casi todo el mundo tiene, han bajado los precios considerablemente») y son mal asesorados por estos personajes. Pero esto no terminó ahí, comencé a recorrer la parte de equipos desktop y escuche los siguientes comentarios :

 

salesmanPrimer Caso

Vendedor :Lo mejor de todo es que este equipo se puede bajar XP, es lo que le debe interesar señora.
Señora: ¿Que es vista? y eso de XP, sabe que yo no tiendo nada, pero si usted lo dice…

Segundo Caso

Patriarca de Familia: A ver, a ver, y trae todos los programas que yo quiero?
Vendedor: No se preocupe, yo por 5 lukas (unos 11 dólares ) yo le instalo el office, el autocad y varios programas.
Patriarca de Familia : Ahh que bueno! los quiero todos, y bueno, para que es el autocad?

Unas breves reflexiones

Uffff, en donde quedaron los tiempos en donde la gente que vendía sabía lo que vendía? o es que quizás nunca existió ese tiempo.

Las casas comerciales deberían capacitar más a los vendedores, para que la decisión que la gente tome, influenciados por los comentarios de ellos, sea la mejor para cada una de las necesidades de los consumidores, de esta manera , no nos encontraríamos con «mi computador anda lento», cuando las necesidades de HW eran importantes y vendieron algo que era para un uso básico.

No se ustedes, si han visto cosas así, derrepente pasan por divertidas, pero en muchos casos, los afectados no lo ven de esta manera.

Que estén bien, y recuerden jugar y sacar buen puntaje en la Evaluación de la Experiencia en Windows  🙂

Gonzalo

Mensajes de alerta y confirmación dentro de UpdatePanels

Hay varias preguntas recurrentes en la vida de un desarrollador, como "cuando me subirán el sueldo?" o "¿Cuando me cambian este maldito monitor, que ya estoy casi ciego". Sin embargo una pregunta frecuente es:

¿ Como envío un alerta o un mensaje de confirmación dentro de un UpdatePanel?

Hay varias maneras de hacerlo, voy a escribir sobre la mía, aunque quizás no sea la mejor, por lo menos me funciona.

Primero, veamos el escenario en donde necesitamos enviar un alert al usuario, luego de realizarse un proceso asincrono.

image

La idea es que haga clic en el botón y luego aparezca el mensaje de confirmación, entonces agregamos:

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Me.Label1.Text = "Proceso realizado"

        Dim script As String = "alert(‘Proceso finalizado’);"

        ScriptManager.RegisterStartupScript(UpdatePanel1, Me.GetType, "", Script, True)

    End Sub

Con esto registramos en el ScriptManager el script en donde lanzamos el mensaje de alerta, con esto, cubrimos nuestro primer requerimiento, si deseas saber más sobre RegisterStartupScript visita MSDN.

 

Mensajes de Confirmación.

Sin duda es útil tener un mensaje de confirmación cuando se está ejecutando un proceso en donde el usuario tiene que determinar si acepta o cancela cierta acción, entonces modifiquemos el ejemplo para determinar si es que el usuario presionó aceptar o cancelar.

image

En este caso vamos a utilizar un HiddenField (WebControl) para almacenar la información en el lado del cliente, de la desición tomada en el confirm, y luego poder obtenerla en el lado del servidor, todo esto, de manera asyncrona (no es la idea que exista un postback y que se note!).

Entonces hacemos:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim script As String = "if(confirm(‘¿Es correcto?’)) {document.getElementById(‘hd’).value=’Aceptar’; setTimeout(‘__doPostBack(‘Label1′,»)’, 0);} else{document.getElementById(‘hd’).value=’Cancelar’;setTimeout(‘__doPostBack(‘Label1′,»)’, 0);}"

        ScriptManager.RegisterStartupScript(UpdatePanel1, Me.GetType, "", script, True)

End Sub

Lo que hacemos acá es aprovecharnos de el campo Oculto(hd) , asignándole un valor por javascript(‘Aceptar’ o ‘Cancelar), y además provocamos el postback asíncrono, llamando a la función __doPostBack, aprovechando el control label1.(No le asignes el botón o caerás en el ciclo infinito).

Por último es necesario, en el evento Load del webform, capturar el valor del campo oculto, cuando el postback ocurre.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Page.IsPostBack Then
            Select Case hd.Value
                Case "Aceptar"
                    Me.Label1.Text = "ACEPTAR"
                Case "Cancelar"
                    Me.Label1.Text = "CANCELAR"
            End Select
        End If
End Sub

Como vemos podemos capturar el valor de campo oculto, con lo que podemos decidir que hacer , no solo al principio de un proceso, puede ser en cualquier momento, y bueno, ya tenemos nuestra confirmación dentro de un UpdatePanel.

Espero que les sirva, si tienen una manera mejor, compartámosla 🙂

[OFF-TOPIC]:Escribriendo Taliban en Windows Live Writer, vean las correcciones sugeridas XD (Italiano!)

image

Creando un Gráfico de Barras con Silverlight y PHP :)

Hola que tal?, mientras escucho Arch Enemy,Dead Eyes See No Future, me me dije a mi mismo «oye mismo, y si el ejemplo del gráfico de barras con Silverlight lo haces con php?» y pensé que era buena idea, ahora bien, no pretendo profundizar en temas de php, y las sentencias que voy a utilizar, si no les gustan a los talibanes de PHP, ejeje, bueno cambian las sentencias, es decir, cambia la forma pero no el fondo.Tengo varios amigos que utilizan php, espero que no se sientan tocados.


Construcción.


Vamos a utilizar los mismos recursos que usamos para el Articulo «Creando un gráfico de barras con silverlight 1.0» , es decir el XAML y los archivos JS , los cuales setean como se va a visualizar el control XAML dentro de la página.


Por razones obvias, el archivo aspx ya no está, lo que esta es nuestra página php, la cual tiene el siguiente código

<?php

 


$con =mysql_connect(«localhost»,«micuenta»,«mipass»);
mysql_select_db(«Animales»);
$año=$_POST[«año»];
if ($año==«»){ $año=2007;} 
$sql=«select Perros,Gatos,Vacas,Cerdos from porcentajes where Periodo=$año»;                $rs=mysql_fetch_array(mysql_query($sql,$con));
$valorPerros=$rs[«Perros»];
$valorGatos =$rs[«Gatos»];
$valorVacas =$rs[«Vacas»];
$valorCerdos=$rs[«Cerdos»];
$AltoBarra  = 415;
$MarcaTexto = 430;
$altoBarraPerros = ($valorPerros * $AltoBarra) / 100;
$altoBarraGatos  = ($valorGatos * $AltoBarra) / 100;
$altoBarraVacas  = ($valorVacas * $AltoBarra) / 100;
$altoBarraCerdos = ($valorCerdos * $AltoBarra) / 100;
$PosicionTextoPerros  = $MarcaTexto – $altoBarraPerros;
$PosicionTextoGatos   = $MarcaTexto – $altoBarraGatos;
$posicionTextoVacas   = $MarcaTexto – $altoBarraVacas;
$posicionTextoCerdos  = $MarcaTexto – $altoBarraCerdos;

// ‘Seteamos el texto que va en cada textblock del control
$TextoPerros = round($valorPerros);
$TextoGatos  = round($valorGatos);
$TextoVacas  = round($valorVacas);
$TextoCerdos  = round($valorCerdos);


$script=» <script type=’text/javascript’> function root_Loaded(sender,args) {«;
$script.=» sender.findName(‘barraPerros’).Height=’$altoBarraPerros’;»;
$script.=» sender.findName(‘valorPerros’)[‘Canvas.Top’]=’$PosicionTextoPerros’;»;     $script.=» sender.findName(‘valorPerros’).Text=’$TextoPerros %’;»;
$script.=» sender.findName(‘barraGatos’).Height=’$altoBarraGatos’;»;
$script.=» sender.findName(‘valorGatos’)[‘Canvas.Top’]=’$PosicionTextoGatos’;»;
$script.=» sender.findName(‘valorGatos’).Text=’$TextoGatos %’;»;
$script.=» sender.findName(‘barraVacas’).Height=’$altoBarraVacas’;»;
$script.=» sender.findName(‘valorVacas’)[‘Canvas.Top’]=’$posicionTextoVacas’;»;
$script.=» sender.findName(‘valorVacas’).Text=’$TextoVacas %’;»;
$script.=» sender.findName(‘barraCerdos’).Height=’$altoBarraCerdos’;»;
$script.=» sender.findName(‘valorCerdos’)[‘Canvas.Top’]=’$posicionTextoCerdos’;»;
$script.=» sender.findName(‘valorCerdos’).Text=’$TextoCerdos %’;»;
$script.=» }</script>»;


?>


Básicamente estamos realizando el mismo proceso, si te das cuenta, vamos a conectarnos una base de Datos Mysql, se hace el query dependiendo del año seleccionado en el combo, se obtienen los datos y se setean las variables para dibujar las barras.


Base de datos Mysql:


image


Luego tenemos las mismas referencias a los archivos JS, imprimiendo luego el resultado de la concatenación de la variable $script:


image 


Por último, en donde necesites mostrar el gráfico haces la llamada a la función createSilverlight();


image


Descarga los archivos y la BD desde acá (ahora funciona el enlace!)


Espero que les sirva :):)


Gonzalo.


 

Creando una Barra de Herramientas con Silverlight

Como ya saben, silverlight viene a dar “luz” a la web, si bien algunos podrían pensar que nada nuevo esta pasando ya que existen tecnologías que hacen lo mismo, sin embargo, Silverlight tiene ventajas sobre esas tecnologías, por ejemplo las “escenas” no se convierten a un archivo compilado cerrado dando la posibilidad de modificarlo ( si es que así se setea) , Silverlight utiliza archivos XAML que contienen la información de los gráficos y animación. Además la programación ( que generalmente es lo que nos interesa) es bastante más amigable para nosotros, los desarrolladores.


La botonera (Ve el resultado de esta botonera haciendo click acá.)


La idea es crear una barra de herramientas animada, que nos pueda sirvir como menú de una pagina web. Hechemos un vistaso de cual es el resultado esperado ( este es solo un ejemplo, andaba falto de imaginación para los íconos).


clip_image002


Cada vez que se pasa el mouse sobre una imagen, se hace el efecto de zoom sobre el ícono, y cuando se presiona sobre él gira en 360 grados ( que lindo no?). El en ícono de Media Center , cuando haces click aparece una ventana con la autoría del este lindo ejemplo, jejeje.


clip_image004


Construcción


Para diseñar la toobar utilizamos Microsoft Expression Blend 2 y para lo programación, notepad ( si como leer, para nuestro ejemplo, nada más). Todos los íconos que utilizamos son PNG, con fondo transparente. El fondo es un rectángulo con los bordes redondeados.


Cada icono tiene asociando los siguientes eventos, las cuales harán llamadas funciones javascript correspondientes, las cuales van a gatillas las animaciones (al igual que el articulo del gráfico de barras)

MouseLeaverunoff» MouseEnterrunon» MouseLeftButtonDownrunclick»

 


Obviamente las llamadas a javascript corresponden a cada opción, es decir:

<script language=»javascript»>

 

function lupaon(sender,args){
     sender.findName(«lupaon»).Begin();
}

 

function lupaoff(sender,args){
     sender.findName(«lupaoff»).Begin();
}

 

function lupaclick(sender,args){
     sender.findName(«lupaclick»).Begin();
}

 

function panelon(sender,args){
     sender.findName(«panelon»).Begin();
}

 

function paneloff(sender,args){
     sender.findName(«paneloff»).Begin();
}

 

function panelclick(sender,args){
     sender.findName(«panelclick»).Begin();
}

 


function basureron(sender,args){
      sender.findName(«basureron»).Begin();

}

 

function basureroff(sender,args){
     
sender.findName(«basureroff»).Begin();
  }

 

function basureroclick(sender,args){
   
 sender.findName(«basureroclick»).Begin();
}

 

function runon(sender,args){
     sender.findName(«runon»).Begin();
}

function runoff(sender,args){
     sender.findName(«runoff»).Begin();
}

function runclick(sender,args){
    sender.findName(«runclick»).Begin();
}
function acercaclick(sender,args){
    sender.findName(«acercaon»).Begin();
}

 

function acercaoff(sender,args){
    sender.findName(«acercaoff»).Begin();
}
function blog(sender,args){
    window.open(«http://geeks.ms/blogs/gperez»,«_blank»);

 

}
</script>

 


Como podemos ver, en cada función javascript se llama al método Begin de cada animación.


 image


Entonces, como decíamos, cada ícono tiene su correspondiente (on,off, click), además existe 3 funciones adiciones(acercarclick,acercaoff, blog), las dos primeras son mostrar y ocultar el cuadro de “Acerca de…” una asociada al icono del media center, la otra asociada a la X para cerrar, recuerda que siempre que quieres hacer referencia a algún objeto debe estar su X:Name seteado. Blog es la función que se llama desde el pseudo link del banner,( solo es un textblock color azul y subrayado).


Debes fijarte en las posiciones cuando haces la animación, para que cuando aumentes de tamaño la imagen, está se vea bien. Recuerda hacer la animación que corresponde a cuando se hace zoom-in y la que hace zoom-out.


Viste que fácil es? Espero que te sirva.  🙂


Ve el resultado de esta botonera haciendo click acá.


Descarga los archivos desde acá.


 


Saludos,
Gonzalo.

Creando un Gráfico de Barras con acceso a Bases de Datos con SilverLight 1.0

Baja el código de ejemplo aquí

Introducción

Como saben, Silvelight es la nueva tecnología de presentación para la web, multiplataforma que nos permite ofrecer contenidos ricos en gráficos y multimedia creado por Microsoft. Si quieres ver más detalles y descargar lo necesario para comenzar a desarrollar, te sugiero que visites http://www.microsoft.com/silverlight

Silverlight en distintos sabores

Silverlight Alpha 1.1, el cual nos permite desarrollar aplicaciones utilizando código .NET, lo cual es una ventaja enorme para la gran cantidad de desarrolladores , además de la velocidad y las operaciones disponibles en un framework reducido de 4.5 MB Aprox. Una de las características interesantes en la posibilidad de acceder al DOM con programación del lado del servidor.

Lo necesario para instalarlo:

· Microsoft VisualStudio 2008

· Silverlight Alpha Tools for VisualStudio 2008

· Silverlight 1.1 Alpha SDK

· Microsoft Expression Blend 2.0

Silverlight 1.0, utiliza exclusivamente JavaScript del browser para implementar la interacción del usuario con el objeto Silverlight, con un framework más pequeño (1.4 mb aprox) y sin la posibilidad de utilizar directamente recursos del servidor.

Lo necesario para instalarlo:

· Silverlight 1.0 SDK

· Microsoft VisualStudio 2008

· Microsoft Expression Blend 2.0

Gráficos de barras con información del lado del servidor con Silverlight 1.0

Si, como lo leen, inicialmente indicábamos que no hay interacción con recursos del servidor con Silverlight 1.0 de manera directa, pero veamos una forma “indirecta” que les va a servir a los desarrolladores ASP.NET y porque no decirlo, a los desarrolladores PHP.

Creando el diseño en Microsoft Expression Blend 2 December Preview

Para esto, utilicé como ejemplo el porcentaje de animales por raza que han sido visitados por un veterinario dentro de una granja (Off record: mi padre tiene una granja, por lo que me gustó este ejemploJ)

La idea es que la información asociada a perros, gatos, vacas y cerdos se vea reflejada en el gráfico. Cada barra fue diseñada con la herramienta de dibujo Rectangle y el Fill de cada uno de los rectángulos con la propiedad Gradient Brush,y luego, con la herramienta Brush Transform clip_image002 modificamos la dirección del relleno de tal manera de lograr el efecto de la figura 1. Cada objeto rectángulo tiene x:name, por ejemplo, la barra de los perros se llama barraPerros.

clip_image004

Figura 1- Aspecto General del Gráfico

Es importante señalar que cada barra tiene acompañado un objeto TextBlock con la propiedad text en null, es necesario setear el x:name de cada TextBlock, ejemplo (valorPerros, valorGatos,etc).

Animación de la Barra

Cada barra del grafico tiene asociada dos animaciones, las cuales le dará el efecto de iluminación cuando el mouse se mueva sobre ella. Estas animaciones serán llamadas desde la página mediante JavaScript, la cuales explicaremos más adelante.

clip_image006 clip_image008 clip_image006[1]

La primera animación para crear el efecto de iluminación (MouseEnter) y la segunda animación es para volver al estado normal el color de la barra (MouseLeave). Con esto completamos el efecto que queremos lograr. Cada objeto Rectagle tiene entonces las siguientes propiedades:

MouseEnter="BarPerroOn" MouseLeave="BarPerroOff" Cursor="Hand">

En donde BarrPeroOn y BarrPerroOff son funciones JavaScript que se gatillarán en los eventos MouseEnter y MouseLeave respectivamente.

    Inicio MouseEnter MouseLeave  

  Ahora que tenemos construido el gráfico, junto con las animaciones, tenemos que asignarle los valores a la propiedad Height de cada barra, dependiendo de los valores que obtendremos de la base de datos. Para lograr esto, vamos a recordar que podemos asociar una función JavaScript que se ejecute en el evento Loaded del Canvas del Objeto Silverlight, entonces, con esta información vamos a realizar lo siguiente.

Generación de JavaScript mediante código manejado.

Podemos generar JavaScript mediante el Control Literal de ASP.NET. Para esto instanciamos un objeto StringBuilder que nos permitirá formar la función JavaScript.

Dim script As StringBuilder = New StringBuilder
script.Append(" <script type=’text/javascript’> function root_Loaded(sender,args) {")
script.Append(" sender.findName(‘barraPerros’).Height=’")
script.Append(altoBarraPerros.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorPerros’)[‘Canvas.Top’]=’")
script.Append(PosicionTextoPerros.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorPerros’).Text=’")
script.Append(TextoPerros)
script.Append("%’;")
script.Append(" sender.findName(‘barraGatos’).Height=’")
script.Append(altoBarraGatos.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorGatos’)[‘Canvas.Top’]=’")
script.Append(PosicionTextoGatos.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorGatos’).Text=’")
script.Append(TextoGatos)
script.Append("%’;")
script.Append(" sender.findName(‘barraVacas’).Height=’")
script.Append(altoBarraVacas.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorVacas’)[‘Canvas.Top’]=’")
script.Append(posicionTextoVacas.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorVacas’).Text=’")
script.Append(TextoVacas)
script.Append("%’;")
script.Append(" sender.findName(‘barraCerdos’).Height=’")
script.Append(altoBarraCerdos.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorCerdos’)[‘Canvas.Top’]=’")
script.Append(posicionTextoCerdos.ToString.Replace(",", "."))
script.Append("’;")
script.Append(" sender.findName(‘valorCerdos’).Text=’")
script.Append(TextoCerdos)
script.Append("%’;")
script.Append(" }</script>")
MyScript.Text = script.ToString

Sin entrar en mayor detalle, con sender.findName, accedemos a los objetos dentro de nuestro control Silverlight y podemos modificar sus propiedades como Height (para el alto de la barra), Canvas.Top, para la posición de cada objeto TextBlock y que no se traslape con su correspondiente barra, Text para setear la propiedad Text del TextBlock con el valor (redondeado en mi caso) del porcentaje. Puedes notar que se hace un remplazo de la coma (;) por el punto(.) esto es porque los valores, para que sean reconocidos como válidos en Silverlight deben tener puntos y no comas.

Datos de la base de Datos

Creamos una tabla con los valores por año, para poder filtrar por ese campo, y en donde tenemos indicadores por animales, cada uno de estos indicadores se verá reflejado en el gráfico.

clip_image010

La método que utilizaremos para la conexión tiene un argumento de entrada que es el año, el cual se obtendrá de un dropdownlist , en el que el usuario seleccionará el año para la confección del gráfico, ejecutamos la query y seteamos las variables de instancia.

Private Sub obtDatos(ByVal año As Integer)
Dim con As New SqlConnection("Data Source=.SQLEXPRESS;AttachDbFilename=C:demosilverlightgraficoDemoGraficoApp_DataAnimales.mdf;Integrated Security=True;User Instance=True")
Dim query As SqlCommand = con.CreateCommand
query.CommandText = "select Perros,Gatos,Vacas,Cerdos from porcentajes where año=@añoParam"
Dim añoparam As New SqlParameter("añoParam", Data.SqlDbType.Int)
añoparam.Value = año
query.Parameters.Add(añoparam)
       
Try
           
con.Open()
           
Dim dr As SqlDataReader = query.ExecuteReader
           
dr.Read()
           
Me.valorPerros = dr.Item("Perros")
           
Me.ValorGatos = dr.Item("Gatos")
           
Me.valorVacas = dr.Item("Vacas")
           
Me.valorCerdos = dr.Item("Cerdos")
           
dr.Close()
       
Catch ex As Exception
           
status.Text = ex.Message.ToString
       
Finally
           
con.Close()
       
End Try
   
End Sub

Ahora bien el alto de la barra se calcula mediante una fórmula sencilla, en donde la constante AltoBarra( que es el alto del y), y MarcaTexto, que nos sirve para calcular la posición del texto en relación al alto de la barra.

Para este ejemplo.

Const AltoBarra As Double = 415
Const MarcaTexto As Double = 430

Calculo de variables

Dim altoBarraPerros As Double = (valorPerros * AltoBarra) / 100
Dim altoBarraGatos As Double = (valorGatos * AltoBarra) / 100
Dim altoBarraVacas As Double = (valorVacas * AltoBarra) / 100
Dim altoBarraCerdos As Double = (valorCerdos * AltoBarra) / 100

‘Lo siguiente es para calcular la posición en donde irá el texto que indica el porcentaje
Dim PosicionTextoPerros As Double = MarcaTexto – altoBarraPerros
Dim PosicionTextoGatos As Double = MarcaTexto – altoBarraGatos
Dim posicionTextoVacas As Double = MarcaTexto – altoBarraVacas
Dim posicionTextoCerdos As Double = MarcaTexto – altoBarraCerdos

‘Seteamos el texto qye va en cada textblock del control
Dim TextoPerros As String = Math.Round(valorPerros).ToString
Dim TextoGatos As String = Math.Round(ValorGatos).ToString
Dim TextoVacas As String = Math.Round(valorVacas).ToString
Dim TextoCerdos As String = Math.Round(valorCerdos).ToString

Luego, con estos datos generamos el Javascript utilizando el control literal “MyScript”

Archivo animacionChart.js

Este archivo contiene las funciones JavaScript necesarias para iniciar las animaciones de las barras, veamos el contenido.

//Ejecutar la animación de la barra de la vacas
function
BarVacaOn(sender,args){sender.findName("vacason").Begin(); }
function
BarVacaOff(sender,args){sender.findName("vacasoff").Begin();}

//Ejecutar la animación de la barra de los perros
function
BarPerroOn(sender,args){sender.findName("perroson").Begin();}
function
BarPerroOff(sender,args){sender.findName("perrosoff").Begin();}

//Ejecutar la animación de la barra de los gatos
function
BarGatoOn(sender,args){sender.findName("gatoson").Begin();}
function
BarGatoOff(sender,args){sender.findName("gatosoff").Begin();}

//Ejecutar la animación de la barra de los cerdos
function
BarCerdoOn(sender,args){sender.findName("cerdoson").Begin();}
function
BarCerdoOff(sender,args){sender.findName("cerdosoff").Begin();}

 

Se observa que en cada función se obtienen la animación correspondiente y se ejecuta el método Begin para que se ejecute.

Archivo Grafico.aspx
Este archivo es bastante simple, tiene las referencias a los archivos JavaScript, un dropdownlist seteado con la propiedad AutoPostBack="True", el control Literal, para imprimir el JavaScript generado y la llamada a la función CreateSilverlight() que genera el control Silverlight y se encuentra en el archivo Silverlight.js.

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Grafico.aspx.vb" Inherits="Grafico" %>
<!
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">
<
head runat="server">
   
<title>Ejemplo Silverlight</title>
   
<script type="text/javascript" src="Silverlight.js"></script>
     
<script type="text/javascript" src="grafico.js"></script>
     
<script type="text/javascript" src="Chart.xaml.js"></script>
     
<script type="text/javascript" src="animacionChart.js"></script>

</
head>
<
body>
   
<form id="form1" runat="server">
   
<div>
        
<asp:Literal ID="MyScript" runat="server"></asp:Literal>
        
Seleccione el año:<br />
        
<asp:DropDownList ID="DropAño" runat="server" AutoPostBack="True">
               
<asp:ListItem>2006</asp:ListItem>
               
<asp:ListItem Selected="True">2007</asp:ListItem>
           
</asp:DropDownList>
     
</div>
     
<div id="silverlightControlHost">
   
  <script type="text/javascript">
                 
createSilverlight();
           
</script>
     
</div>
     
<!– Runtime errors from Silverlight will be displayed here.

     
This will contain debugging information and should be removed or hidden when debugging is completed –>

     
<div id=’errorLocation’>
       
<asp:Label ID="status" runat="server"></asp:Label>
   </div>
   
</form>

 </body>
</
html>

Luego ejecutamos el demo y tenemos el siguiente resultado:

img3

Vídeo de como funciona 🙂

Conclusión

Silverlight es una herramienta con la cual podemos dotar a nuestras aplicaciones Web de nuevos contenidos ricos en gráficos y multimedia. La facilidad con que podemos generar gráficos de alto impacto, como también crear animaciones es una potencialidad que sin duda debemos aprovechar en nuestros desarrollos. Así también la forma de acceder mediante Javascript para manejar los objetos dentro del XAML nos provee una poderosa herramienta. Este mismo ejemplo pudo ser generado con otras tecnologías del lado del servidor como lo es PHP, JSP, etc., permitiendo integrar Silverlight a desarrollos con distintas plataformas.

RAPIDO! Proyecto GEMINIS 48 hrs.

Hay que inscribirse rápidamente :), la idea es probar y apreder conocimicientos en ASP.NET, ¿eres desarrollador php? mucho mejor!! , la idea es migrar código en php a asp.net. Y bueno, si eres buen desarrollador, por lo general lo eres para todos los lenguajes, así que dale, inscríbete en:

http://www.mslatam.com/latam/msdn/es/geminis48/

Te dejo la explicación de la gente de MSDN, que seguro es más clara que la mía  😛

«Para participar de la Misión Géminis 48 hs., sólo tienes que ser un desarrollador que te gusten los desafíos. La idea es que compitas con tus pares para demostrar en 2 etapas qué tanto sabes acerca de .Net y PHP. Durante la primera etapa deberás responder una serie de preguntas de selección múltiple sobre estos lenguajes de programación. Los participantes que contesten correctamente todo el cuestionario, con la posibilidad de múltiples intentos, podrán pasar a la segunda etapa – La Misión. Allí deberás estar preparado para el reto de desarrollar una aplicación web funcional, un sistema de Control Epidemiológico basado en PHP, y migrarla a ASP.NET. Tendrás sólo 48 horas para hacerlo, y los primeros 48 que lo hagan estarán participando por increíbles premios. Los 3 ganadores designados por especialistas calificados recibirán U$D 1.000, U$D 800 y U$D 400, respectivamente. Muchos éxitos para tu misión…»

Ready?

Controlando las Excepciones en Microsoft Workflow Foundation.


Introducción


Seguramente ya has escuchado sobre WWF (ya me imagino que sabes que no estoy hablando de Hulk Hogan), más bien, sobre la nueva visión sobre el modelado de procesos de negocios de Microsoft expuesto a través de .NET Framework 3.0. En este artículo no vamos a revisar los conceptos fundamentales de WWF, más bien vamos a revisar como podemos administrar las excepciones ocurridas dentro de una actividad de un Workflow.


La forma que veremos en este articulo, será agregar actividades tipo manejadores de excepciones(FaultHandler) al todo el WF, ya que también es posible ( y seguramente más conveniente en algunos casos) agregar  FaultHandler para las actividades Sequence (actividades compuestas).


Diseñando el Workflow


Para este ejemplo, utilizaremos el template, Secuential WorkFlow Console Application, de tal manera de tener un workflow de ejecución secuencial y que podamos imprimir los resultados de la ejecución por consola.


Básicamente tenemos el siguiente WF.







imagen2
Figura 1 – Diseño del Workflow

En Donde el código programático asociado a esto es:

Public class Workflow1
Inherits SequentialWorkflowActivity
Dim VectorA() As Integer = {3, 4, 1}

Private Sub Actividad1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 1: Iniciando WF»)
Console.ReadKey()
End Sub

Private Sub Actividad2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 2: Imprimiendo VectorA»)
Dim i As Integer = 0
For i = 0 To 2 Step 1
Console.WriteLine(VectorA(i))
Next
Console.ReadKey()
End Sub

Private Sub Actividad3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 3:Fin de WF»)
Console.ReadKey()
End Sub
End Class


 


Al ejecutar el programa esto funciona sin problemas arrojando el siguiente resultado:







imagen3
Figura 2 – Probando…

Hasta ahora bien, ¿Pero que sucedería si hacemos el for hasta un valor que este fuera del rango del índice del VectorA?, Sucedería que se levantaría una excepción no manejada, y se mostrará el mensaje de la excepción debido a que el template que estamos utilizando utiliza el siguiente código para imprimir el mensaje.

Shared Sub OnWorkflowTerminated(ByVal sender As Object, ByVal e As WorkflowTerminatedEventArgs)
Console.WriteLine(e.Exception.Message)
WaitHandle.Set()
End Sub

Obviamente surge la necesidad de poder controlar estas excepciones, y es aquí cuando entra la Vista de «View Fault Handlers», la cual nos permitirá agregar las actividades FaultHandlers correspondientes para manejarlas.







imagen5
Figura 3- View Fault Handlers

  Una vez que se a seleccionado la Vista de Fault Handlers, podremos ver las opciones disponibles, en donde podremos arrastrar las FaultHandlersActivity  y también las actividades asociadas a ese manejador de excepción FaultHandlerActivity.(Si pensabas que eran lo mismo, fíjate que la primera el plural y la segunda singular, jejjeje, no es solo cosa del lenguaje, es que es la actividad asociada a un manejador específico)







imagen6
Figura 4 – Agregando FaultHandlersActivity 

Arrastramos las actividades en los sectores correspondientes y vamos a tener algo como en la figura 5. Ahora tenemos que setear el FaulType de cada FaultHandlersActivity, según el tipo de excepciones que queramos controlar. Esto es como los bloques Try-Catch, en donde vamos agregando Catch según los tipos de excepciones que estamos manejando. Esto quiere decir, que por cada FaultHandlersActivity, podemos tener uno o más FaultHandlerActivity(ActManejoErr1 en la figura 5) que manejen la excepción configurada en el FaulType.







imagen8 
Figura 5 – Agregando más de un  FaultHandlersActivity  y el correspondiente FaultHandlerActivity(ActManejoErr1)

Si no te acuerdas del nombre completo de la excepción que vas a manejar, puedes browsear y seleccionar el tipo derivado de System. Exception, como te decía antes, busca la excepción que vas a manejar.







imagen9
Figura 6 – Explorando y Seleccionando el tipo derivado de System. Exception

Lo anterior lo debes realizar para cada uno de los  FaultHandlersActivity. Una vez que ya agregamos las actividades que van a manejar las excepciones.(muy bueno!).


Ahora bien, vamos a generar excepciones recorriendo el arreglo fuera de los índices del mismo, y por otra parte, haciendo un casting inválido, en el caso que ejecutemos la aplicación con el nuevo código, te darás cuenta que la primera excepción es la que se levanta y captura, escribí la segunda excepción VectorA(1) = CInt(«hola»), para probar más de un FaultHandlersActivity.

Option Strict On
Public Class Workflow1
Inherits SequentialWorkflowActivity
Dim VectorA() As Integer = {3, 4, 1}

Private Sub Actividad1_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 1: Iniciando WF»)
Console.ReadKey()
End Sub

Private Sub Actividad2_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 2: Imprimiendo VectorA»)

Dim i As Integer = 0
For i = 0 To 3 Step 1
Console.WriteLine(VectorA(i))
Next
VectorA(1) = CInt(«hola»)
Console.ReadKey()
End Sub

Private Sub Actividad3_ExecuteCode(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Actividad 3:Fin de WF»)
Console.ReadKey()
End Sub

Private Sub ActManejoErr1(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Estoy Manejando la Excepcion System.IndexOutOfRangeException»)
Console.ReadKey()
End Sub

Private Sub ActManejoErr2(ByVal sender As System.Object, ByVal e As System.EventArgs)
Console.WriteLine(«Estoy Manejando la Excepcion System.InvalidCastException»)
Console.ReadKey()
End Sub
End Class







imagen10

Figura 7 – Probando…


Como vez,  funciona y es bastante sencillo, puedes probar agregando más manejadores de excepciones en tu aplicación, así que a seguir probando :).


Saludos,
Gonzalo.