Introducción al control de Bing Maps para Silverlight (Screen Cast 1 de 3)

El día de ayer tuvimos una reunión más de La Liga Silverlight, en esta ocasión vimos una introducción al uso del control de Bing Maps para Silverlight.  Debido a problemas técnicos la sesión no pudo ser grabada pero al finalizar el Web Cast me dispuse a grabar una serie de 3 Screen Casts en donde se explica lo expuesto en la sesión en vivo.

En este primer Screen Cast podemos ver cómo incluir el control de Bing Maps en nuestras aplicaciones de Silverlight y algunas propiedades básicas para desplegar el mapa.

 

El archivo lo pueden descargar de aquí.

Share/Save/Bookmark

Leave a Comment

La Familia MVP tiene un nuevo integrante

Para mí el día de hoy ha sido colmado con alegría y satisfacción profesional ya que he sido nombrado Microsoft MVP en la categoría de ASP.NET para el año 2009.  Es un verdadero honor el pertenecer a este selecto grupo de personas, quienes se distinguen por su gran pasión por la tecnología y talento.

Esto no hubiera sido posible sin el apoyo de todas las personas que han creído en mí durante todos estos años de carrera profesional; personas con las cuales he compartido encuentros (y desencuentros), quienes me han apoyado dentro y fuera del plano laboral y al gran equipo de Microsoft.

A todos ustedes: Gracias (you know who you are).  Me esforzaré a que este sea el primero de muchos.

 

¡Más por venir!

Share/Save/Bookmark

Comments (3)

Subiendo archivos al servidor en aplicaciones Silverlight

Introducción

Es muy común que para nuestras aplicaciones Web necesitemos ofrecer a los usuarios la capacidad de subir archivos al servidor por diversas razones: para su posterior procesamiento, respaldo de información, etc.  En este artículo veremos cómo en Silverlight esta tarea es sencilla por medio de la clase WebClient.

WebClient.OpenWriteAsync()

La clase WebClient permite una comunicación asíncrona entre el aplicativo Silverlight y algún endpoint que deseemos leer o escribir.  Es precisamente por medio de su método OpenWriteAsync por el cual podemos establecer un Stream de escritura para poder grabar en el servidor algún archivo que el usuario seleccione en la aplicación por medio de la caja de diálogo OpenFileDialog.  Es de vital importancia el mencionar que Silverlight, al ejecutar bajo un esquema de confianza media (Medium Trust) debido a que corre en un SandBox, no es capaz de acceder el sistema de archivos de la máquina en donde está ejecutando la aplicación, sino solamente a través de la autorización del usuario por medio de la caja de diálogo mencionada.

Bajo estas premisas, desarrollaremos la siguiente solución que demuestra lo siguiente:

  1. El uso de la clase OpenFileDialog para permitir al usuario seleccionar algún archivo que quiera subir al servidor.
  2. El uso de la clase WebClient y su método OpenWriteAsync para poder escribir en un Stream la secuencia de bytes que representen dicho archivo.
  3. La creación de una página .aspx que obtenga el Stream y escriba el archivo en el servidor

La aplicación tendrá la siguiente interfaz de usuario:

<UserControl x:Class="SilverlightApplication4.Page"

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

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Width="200" Height="100">

    <Grid x:Name="LayoutRoot" Background="Azure">

        <Grid.RowDefinitions>

            <RowDefinition />

            <RowDefinition />

        </Grid.RowDefinitions>

        <Button x:Name="btnUpload" 

                Content="Subir archivo..." 

                Width="100" 

                Height="30"

                HorizontalAlignment="Left"

                Margin="5"

                />

        <TextBlock x:Name="txtFileName" 

                   HorizontalAlignment="Left"

                   Margin="5"

                   Grid.Row="1" />

    </Grid>

</UserControl>

El botón llamado btnUpload tendrá la responsabilidad de mostrar la caja de diálogo OpenFileDialog para que el usuario selecciones un archivo de su sistema de archivos local.  El archivo seleccionado está representado con la propiedad File del objeto OpenFileDialog, y utilizaremos el método OpenRead() para leerlo como un Stream.  Posteriormente guardaremos en una variable llamada bytes la secuencia de bytes del archivo.

El siguiente paso será crear el manejador del evento OpenWriteCompleted, evento que se dispara cuando se haya creado efectivamente el Stream de escritura en el servidor.  Es en este manejador de evento en donde escribiremos la secuencia de bytes del archivo (variable llamada bytes) en el Stream.

Posteriormente ejecutaremos el método OpenWriteAsync() de la clase WebClient, el cual nos permitirá crear un Stream de escritura en el endpoint especificado en el argumento.  En el caso de nuestra aplicación usaremos Upload.aspx, el cual es una página de ASP.NET que además le mandaremos como parámetro el nombre del archivo seleccionado para evitar tener un nombre de archivo ‘hard-coded’.

El siguiente fragmento de codigo muestra esta funcionalidad completa:

btnUpload.Click += (sender, args) =>

    {

 

        OpenFileDialog ofd = new OpenFileDialog();

 

        //Abre la caja de diálogo

        if (ofd.ShowDialog().Value)

        {

            string fileName = ofd.File.Name;

            txtFileName.Text = fileName;

            Stream archivo = ofd.File.OpenRead();

            byte[] bytes = new byte[archivo.Length];

            archivo.Read(bytes, 0, bytes.Length);

 

 

            WebClient client = new WebClient();

            client.WriteStreamClosed += (s, a) =>

            {

                if (a.Error == null)

                {

                    //El archivo fue subido correctamente

                }

            };

 

            client.OpenWriteCompleted += (s, a) =>

            {

                if (a.Error == null)

                {

                    //El Stream ha sido abierto correctamente

                    //Escribe la secuencia de bytes en el Stream abierto

 

                    Stream stream = a.Result;

                    stream.Write(bytes, 0, bytes.Length);

                    stream.Flush();

                    stream.Close();

                }

            };

 

            //Abre un Stream de escritura

            client.OpenWriteAsync(new Uri(string.Format("/Upload.aspx?n={0}", fileName),

                UriKind.RelativeOrAbsolute));

        }

 

    };

Upload.aspx

En este ejemplo estamos usando una página de ASP.NET llamada Upload.aspx, la cual obtiene el Stream que se escribió en el código anteriormente descrito, y que servirá para efectivamente guardar ese Stream como un archivo en el servidor.  El nombre para el archivo es determinado a partir del valor del parámetro n en el querystring.  En el caso de esta solución el archivo se escribirá en el fólder ClientBin en el servidor, aunque podría obviamente ser parametrizable la localización en el servidor (tal vez a través de otro parámetro en el querystring).

El siguiente bloque muestra el código completo de Upload.aspx:

protected void Page_Load(object sender, EventArgs e)

        {

            //Nombre del archivo

            string fileName = string.Empty;

 

            try

            {

 

                if (Request.QueryString["n"] != null)

                    fileName = Request.QueryString["n"];

                else 

                    return;

 

                Stream inputStream = Request.InputStream;

                byte[] bytes = new byte[inputStream.Length];

 

                //Guarda el archivo en el fólder ClientBin

                StreamWriter sw = new StreamWriter(Server.MapPath("/ClientBin/") + fileName);

                BinaryWriter bw = new BinaryWriter(sw.BaseStream);

                inputStream.Read(bytes, 0, bytes.Length);

                bw.Write(bytes);

                bw.Flush();

                bw.Close();

 

            }

            catch (Exception) { throw; }

 

        }

Debemos mencionar que también sería posible reemplazar la página .aspx por una Handler .ashx e implementar en dicho archivo la funcionalidad descrita en el bloque de código anterior, también leyendo el Stream, obteniendo la secuencia de bytes y escribirla en el sistema de archivos.

Finalmente, la siguiente ilustración muestra la aplicación finalizada en donde podemos hacer lo siguiente:

  1. Hacer clic en el botón de Silverlight llamado ‘Subir archivo…’, esto invoca la caja de diálogo de Abrir archivo (Figura 1)
  2. Seleccionar el archivo y seleccionar OK (Figura 2)
  3. Se muestra el archivo seleccionado ya subido al servidor, en el fólder ClientBin el cual en este caso es el Sitio de Origen.

Resumen

Subir archivos al servidor es muy común en las aplicaciones Web y las aplicaciones de tipo RIA no están excluidas de ello.  En este artículo vimos cómo al utilizar las clases WebClient y OpenFileDialog podemos lograr esta funcionalidad en Silverlight y utilizar una página .aspx como puente para lograrlo.

 

Share/Save/Bookmark

Comments (1)

Web Cast: Introducción al control de Bing Maps para Silverlight

Ha sido reprogramado el Web Cast “Introducción al control de Bing Maps para Silverlight” para el próximo día martes 30 de Junio a las 7:00pm –06:00 GMT.  En este Web Cast veremos las características que nos ofrece este control para nuestras aplicaciones de Silverlight 2 y Silverlight 3.

Les recuerdo que Bing es el nuevo nombre que tiene la plataforma que conocíamos como Live, es por eso que ya no se llama Virtual Earth :)

Orador: Rodrigo Díaz Concha

Los invito a que se registren en esta liga

Los esperamos!

Share/Save/Bookmark

Leave a Comment

Web Cast: Introducción al Control de Virtual Earth para Silverlight

Les ofrecemos una disculpa a todos los que esperaron el Web Cast del día de hoy; sin embargo tuvimos problemas de lógistica y tiempo que fueron más allá de nuestro alcance.  Agradecemos a todos su comprensión y les anunciamos que el Web Cast será re-programado para las próximas semanas.

Gracias por su comprensión y saludos!

Share/Save/Bookmark

Leave a Comment

Web Slices de Internet Explorer 8 con Silverlight

En el marco del Festival de Instalación de Internet Explorer 8 que tuvimos el día de hoy en varias ciudades de todo México, quiero detallar la potencia que tienen los Web Slices sobre todo si los usamos con una plataforma RIA como Silverlight.

Pero ¿qué es un Web Slice?  Un Web Slice es un fragmento o vista previa de una página que puede mostrarse en una ventana dentro de Internet Explorer 8 sin necesidad de cambiarte de la página en donde estás actualmente.  La creación de los Web Slices es bastante sencilla ya que no son más que fragmentos de código HTML que deben implementar ciertas clases de Css específicas, para que el navegador trate ese fragmento como, precisamente, un Web Slice.  Estas clases están definidas en la Especificación del Formato de los Web Slices que podemos encontrar en el MSDN y que al tiempo de la publicación de este artículo se encuentra en la versión 0.9.

Las clases más básicas para la construcción de Web Slices son las siguientes:

  • hslice:  Indica el comienzo de la definición del Web Slice (requerido)
  • entry-title: Indica el título para el Web Slice (requerido)
  • entry-content: Indica el contenido para el Web Slice (opcional)
  • feedurl:  Se aplica al atributo rel de un elemento <a> e indica una fuente de dónde podemos tomar información para incluir en el Web Slice (opcional)
  • bookmark:  Se aplica al atributo rel de un elemento <a> e indica la ruta de navegación al abrir el Web Slice

El siguiente fragmento de código muestra la implementación de un Web Slice simple:

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

<head>

    <title></title>

</head>

<body>

    <div class="hslice" id="div1">

        <div class="entry-title">

            Web Slice de Ejemplo

        </div>

        <div class="entry-content">

            <h1>Web Slice</h1>

            <p>Fragmento de una página que puede verse en una ventana dentro de Internet Explorer 8</p>

        </div>

    </div>

</body>

</html>

Cuando Internet Explorer 8 muestra una página en donde se encuentra un fragmento como el anterior, se mostrará la opción para agregar Web Slices al navegador como lo muestra la siguiente figura:

Menú de agregar Web Slice

Al agregar el Web Slice, este será colocado en el menú del navegador, listo para poderlo utilizar incluso sin cambiarnos de la página actual que estemos desplegando!

Web Slice básico

Web Slices + Silverlight = Pareja perfecta

Ahora bien, gracias a esta característica, incluso nos será posible a los desarrolladores de Silverlight el crear Web Slices que no solamente utilicen HTML como lo vimos en el ejemplo anterior, sino que también podremos utilizar Silverlight como parte del Web Slice, a través de la instanciación correspondiente del plugin dentro de él (usando el elemento <object> por ejemplo).

Por ejemplo, en mi blog tengo un widget hecho con Silverlight 2 que muestra la lista de próximos cursos del Silverlight Tour.  Este widget está incorporado a través de los propios widgets de WordPress: el motor de blogging que usa mi sitio.  La instanciación de la aplicación de Silverlight es hecha a través de un <object> el cual se le pasan los parámetros correspondientes, principalmente el parámetro source el cual indica de dónde tomará el empaquetado .xap para su instanciación:

<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">

    <param name="source" value="http://silverlight-tour.com.mx/ClientBin/DevMasters.SilverlightTour.xap"/>

    <param name="minRuntimeVersion" value="2.0.31005.0" />

    <param name="autoUpgrade" value="true" />

    <param name="initParams" value="widget=true" />

    <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

         <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>

    </a>

</object>

Y es debido a esto precisamente que podemos realizar una segunda página HTML que implemente la aplicación de Silverlight, y sea esta página la que invoquemos desde el Web Slice!  Los siguientes fragmentos de código muestran la página que hospeda la aplicación Silverlight, como el Web Slice que es desplegado en el menú de Internet Explorer 8 respectivamente:

Aplicación Silverlight

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

<head>

    <title>Silverlight Tour</title>

</head>

<body style="margin: 0px">

    <object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">

        <param name="source" value="http://silverlight-tour.com.mx/ClientBin/DevMasters.SilverlightTour.xap"/>

        <param name="onerror" value="onSilverlightError" />

        <param name="minRuntimeVersion" value="2.0.31005.0" />

        <param name="autoUpgrade" value="true" />

        <param name="initParams" value="widget=true" />

        <param name="enablehtmlaccess" value="true" />

        <a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;">

             <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>

        </a>

    </object>

</body>

</html>

 

Web Slice

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

<head>

    <title></title>

</head>

<body>

    <div class="hslice" id="div1">

        <div class="entry-title">

            Silverlight Tour

        </div>

        <a rel="entry-content" href="WebSlice.html"></a>

        <a rel="Bookmark" href="http://silverlight-tour.com.mx"></a>

    </div>

</body>

</html>

El Web Slice, al ser agregado a través del menú correspondiente en Internet Explorer, permitirá que tengamos el siguiente Web Slice en el navegador:

Web Slice con Silverlight

Demostrando así que podemos incorporar Silverlight 2 o 3 dentro de los Web Slices y no estar limitados a las propias fronteras de HTML.  Cabe notar el uso del atributo rel=”bookmark"; esto indica el Url a donde irá el navegador cuando abramos el Web Slice con el botón dentro de su ventana.

Resumen

Los Web Slices nos permiten desplegar un fragmento de contenido en un menú dentro de Internet Explorer 8.  Esta característica brinda a los usuarios un mecanismo de actualización de información sin tener que estar consultando la o las páginas en cuestión cada vez.  Similar a lo que conseguimos hoy en día con RSS pero con mayor potencia ya que podemos complementar la experiencia para el usuario con el uso de Silverlight.

Share/Save/Bookmark

Comments (1)

Silverlight Tour: Nuevas Ciudades y Fechas próximas

¿Estás listo para aprender Silverlight 3?

Todavía hay lugares para las próximas fechas que el Silverlight Tour tendrá dentro de México:  Veracruz, Ver., Mérida, Yuc., y Villahermosa, Tab.  Si desean aprender Silverlight 2 y 3 a profundidad bajo la enseñanza de los expertos, y están en alguna de esas ciudades (o ciudades cercanas) los invito a que se registren.

Curso de Silverlight en Veracruz Curso de Silverlight en Mérida Curso de Silverlight en Villahermosa

El Silverlight Tour Workshop es un curso de tres días de alta profundidad técnica acerca de Silverlight 2 y 3. El curso se imparte en varios idiomas en diferentes países en todo el Mundo.

Incluye:

  • 3 días de entrenamiento intensivo de Silverlight 2 y 3
  • Cobertura de Expression Blend y Visual Studio .NET 2008
  • Arquitectura de Soluciones con Silverlight
  • Comunicación con el Servidor
  • Creación dinámica de contenido XAML
  • Comunicación con el DOM
  • La experiencia fuera del Navegador
  • Mejoras a la Estilización, incluyendo Diccionarios Merge y Estilos Based-On
  • Validación de Datos utilizando el Modelo de Controles
  • Utilización de XML Binario
  • Utilización de la nueva API de Bitmaps
  • Cobertura de Expression Blend 3 Preview
  • Etc…
  • Material totalmente en Español

 

Los esperamos!

 

Ver la Agenda Mundial

 

Share/Save/Bookmark

Leave a Comment

Código Fuente: Creando un Reproductor MP3 con Silverlight 3

Reproductor de mp3 con Silverlight 3

Hace algunos días tuvimos otra reunión virtual más de La Liga Silverlight.  En esa sesión vimos cómo con Silverlight 3 podemos construir fácilmente un reproductor mp3 que incluso corra fuera del navegador gracias a la característica de ejecución Out-Of Browser (OOB) implementada en Silverlight 3.

Para todos aquellos asistentes que nos acompañaron aquí les dejo el url para poder descargar el código fuente que hicimos durante la sesión.

Sentimos mucho por esta ocasión no tener la sesión grabada ya que tuvimos un percance técnico de último momento pero esperemos a que las siguientes sesiones tengan la posibilidad de descargarlas para que las puedan ver posteriormente.

Salu2!

Share/Save/Bookmark

Leave a Comment

Festival de Instalación de Internet Explorer 8 – Guadalajara

Los esperamos el día de hoy al Festival de Instalación de Internet Explorer 8: la última versión del navegador de Microsoft, el cual incluye nuevas y novedosas características de seguridad, Web Slices, Aceleradores, etc.

En el caso de Guadalajara, Jalisco, los esperamos el día de hoy 16 de Junio a las 17:30 hrs. en la Sala 1 del Centro del Software (Av. López Mateos y Cubilete).  En el evento estaremos representantes de las diversas comunidades MSDN presentes en el estado para poder compartir con todos ustedes las ventajas que obtenemos al usar esta nueva versión del navegador.

Poster del Festival de Instalación de IE8

Los esperamos a todos (as) !!!

Share/Save/Bookmark

Comments (2)

Recordatorio: “Creando un reproductor de mp3 en Silverlight 3”