Introducir el control SaveFileDialog en Silverlight 3

En la siguiente entrada voy a describir la inclusión de una utilidad de uso frecuente, el SaveFileDialog, en una aplicación web creada con Silverlight 3.

Empezaré con la creación de los controles con los que va interactuar el usuario. En este caso son un botón, que ejercerá de desencadenante de la acción descrita con anterioridad y un TextBlock que se encargará de mostrar los posibles mensajes de error.

<UserControl

x:Class=»SaveDialog.MainPage»

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

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

xmlns:navigation=»clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation»

xmlns:uriMapper=»clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation»

xmlns:d=»http://schemas.microsoft.com/expression/blend/2008″ xmlns:mc=»http://schemas.openxmlformats.org/markup-compatibility/2006″

mc:Ignorable=»d» d:DesignWidth=»640″ d:DesignHeight=»480″>

 

<Canvas x:Name=»LayoutRoot» Background=»White»>

<Button x:Name=»btnSaveFile» Width=»100″ Height=»20″

Content=»Guardar Archivo» Click=»btnSaveFile_Click»

Canvas.Top=»10″ Canvas.Left=»10″></Button>

<TextBlock x:Name=»tblError» Canvas.Top=»40″ Canvas.Left=»10″></TextBlock>

</Canvas>

 

</UserControl>

El código que cobra una verdadera importancia es el siguiente código Behind:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.IO;

using SaveDialog.FilesServiceReference;

 

namespace SaveDialog

{

public partial class MainPage : UserControl

{

#region Fields

private SaveFileDialog dialog;

#endregion

 

#region Constructors

public MainPage()

{

InitializeComponent();

 

this.dialog = new SaveFileDialog();

 

try

{

this.dialog.DefaultExt = «.txt»;

this.dialog.Filter = «Archivos de Texto|*.txt|Archivos de Registro|*.log|Todos los Archivos|*.*»;

this.dialog.FilterIndex = 2;

}

catch (Exception ex)

{

this.tblError.Text = «Error al configurar el SaveFileDialog: « + ex.Message;

}

}

#endregion

 

#region Handlers

private void btnSaveFile_Click(object sender, RoutedEventArgs e)

{

bool? dialogResult = this.dialog.ShowDialog();

 

if (dialogResult == true)

{

try

{

FilesServiceReference.FilesClient fileClient

= new FilesClient();

fileClient.GetFileCompleted

+= new EventHandler<GetFileCompletedEventArgs>(

fileClient_GetFileCompleted);

fileClient.GetFileAsync();

 

this.tblError.Text = «Opteniendo Archivo desde el Servidor…»;

}

catch (Exception ex)

{

this.tblError.Text = «Error de llamada al Servicio: « + ex.Message;

}

}

}

void fileClient_GetFileCompleted(object sender, GetFileCompletedEventArgs e)

{

try

{

byte[] fileBytes = e.Result as byte[];

 

using (Stream fs = (Stream)this.dialog.OpenFile())

{

fs.Write(fileBytes, 0, fileBytes.Length);

fs.Close();

 

this.tblError.Text = «El Archivo ha sido guardado correctamente!»;

}

}

catch (Exception ex)

{

this.tblError.Text = «Error Al obtener el resultado: « + ex.Message;

}

}

#endregion

 

}

}

¿Demasiado código que no entiendes? Tranquilo, como puedes observar, he reseñado las partes que son pieza clave en este conjunto de código y te las voy a explicar detalladamente.

Para que mi aplicación se ponga en marcha lo primero es crear una instancia de la clase SaveFileDialog:

private SaveFileDialog dialog;

Seguidamente tengo que tenerlo incializado en el constructor.

this.dialog = new SaveFileDialog();

Ahora voy a cambiar algunas de las propiedades originales del objeto SaveFileDialog del siguiente modo:

this.dialog.DefaultExt = «.txt»;

this.dialog.Filter = «Archivos de Texto|*.txt|Archivos de Registro|*.log|Todos los Archivos|*.*»;

this.dialog.FilterIndex = 2;

 

La primera propiedad que he modificado es la extensión del archivo que guardará por defecto,en este caso .txt.La segunda propiedad,es el filtro que va aplicar nuestro control, a la hora de visualizar los archivos que mi equipo contiene.La última propiedad es el indice del formato de texto que aparecerá en nuestro control, en este caso me aparecerá por defecto Archivos de Registro ya que he elegido la opción dos,cabe destacar que el indice no comienza en cero.

 

Continuando, al presionar sobre el botón para guardar el archivo, este realiza una llamada al método ShowDialog de la clase SaveFileDialog().

 

bool? dialogResult = this.dialog.ShowDialog();

Después compruebo que es verdadera la petición realizada con anterioridad.

if (dialogResult == true)

 

Al ser verdadero el resultado devuelto, realizo una llamada al servicio para obtener un archivo de texto desde el servidor.

Este archivo es tomado como un Array de Bytes, que escribiremos y devolveremos a través del método OpenFile de la clase SaveFileDialog.

 

using (Stream fs = (Stream)this.dialog.OpenFile())

{

fs.Write(fileBytes, 0, fileBytes.Length);

fs.Close();

this.tblError.Text = «El Archivo ha sido guardado correctamente!»;

}

 

Por último informaré al usuario que el archivo ha sido guardado correctamente, mediante un mesaje mostrandolo en pantalla.

Para finalizar como veis, a través de silverlight3 podemos utilizar un control que se usa con asidua frecuencia en la realización de las tareas diarias de nuestro trabajo, sin demasiada complejidad a la hora de crear el citado control.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *