Featured Posts

Silverlight 5 Ya DisponibleSilverlight 5 Ya Disponible El día de hoy 09 de Diciembre 2011 ha sido liberada la nueva versión de Silverlight 5.  Esta versión final es la 5.0.61118. ¿Qué es Silverlight? Silverlight es...

Readmore

Silverlight Tour–Actualizado a Silverlight 5 RTWSilverlight Tour–Actualizado a Silverlight 5... Tengo el gusto de anunciarles que el Curso que Da La Vuelta al Mundo, el famoso Silverlight Tour, ha sido actualizado a la versión final de Silverlight 5. El Silverlight...

Readmore

Nueva carrera en Microsoft Virtual Academy: Windows Phone 7.1 (Mango)Nueva carrera en Microsoft Virtual Academy: Windows... Tengo el gusto de darles a conocer la disponibilidad de una nueva carrera en el Microsoft Virtual Academy (MVA): La carrera de Windows Phone 7.1 Mango. Esta es la descripción...

Readmore

Nueva carrera en Microsoft Virtual Academy: Silverlight 4Nueva carrera en Microsoft Virtual Academy: Silverlight... ¿Eres estudiante de Microsoft Virtual Academy (MVA)? Tengo el gusto de anunciarles oficialmente el lanzamiento de la nueva carrera de Silverlight 4 para esta plataforma educativa. La...

Readmore

Curso gratuito de Introducción a Silverlight 4 – 2da. ParteCurso gratuito de Introducción a Silverlight... Tengo el gusto de informarles que ya está disponible la segunda parte del Curso gratuito de Introducción a Silverlight 4 en Español, el cual ahora consta de un total...

Readmore

Rodrigo Díaz Concha Rss

Silverlight 4 Beta – Impresión, Modularización y Parámetros

Posted on : 23-11-2009 | By : Rodrigo | In : Silverlight 4

Tags: , ,

0

En el artículo anterior vimos cómo mandar a imprimir múltiples páginas dentro de nuestras aplicaciones de Silverlight 4.  En este artículo iremos un paso más allá, modularizando un poco más nuestro código e implementando la funcionalidad de parametrización de las opciones de impresión (encabezado y márgen principalmente).  Esto nos ofrecerá un código más robusto que permita escenarios de impresión más detallados.  Nota: esta implementación es una propuesta e idea para poder modularizar y de ninguna manera pretende ser el único mecanismo o camino para lograrlo.

La Solución

Utilizaremos la misma solución del proyecto del artículo anterior.  A esta solución le agregaremos un nuevo proyecto de tipo Silverlight Class Library para poder incorporar en él la funcionalidad de impresión, en vez de tenerlo directamente en el code-behind de MainPage.xaml del proyecto Silverlight.  Al nuevo proyecto le pondremos el nombre de SL4.Demo.Impresion.Util y agregaremos dos clases: Impresion.cs y Parametros.cs

image

image

Impresion.cs

Será en esta clase en donde implementaremos el código de impresión.  Esta clase tendrá un método público Imprimir() el cual nos servirá como manejador del evento clic del botón en donde deseemos invocar la funcionalidad (botón button2 en MainPage.xaml).  De esta manera estaremos manejando el evento clic en una instancia de Impresion en vez de hacerlo directamente en code-behind.

La clase Impresion será de tipo genérica, ya que necesitamos conocer de antemano el tipo de contenido que se mandará a imprimir para poder realizar el filtrado de los registros de manera adecuada.  En nuestro ejemplo es un objeto de tipo Albumes.

Por las razones descritas, el código de MainPage.xaml.cs quedará de la siguiente manera:

public partial class MainPage : UserControl
    {
        SL4.Impresion.Impresion<Album> util = null;

        public MainPage()
        {
            InitializeComponent();

            util = new Impresion.Impresion<Album>(this.Resources["albumes"] as Albumes,
                this.Resources["ImpresionDataTemplate"] as DataTemplate,
                40.0,
                "Documento de Prueba",
                "Lista de Álbumes – The Beatles");

            util.ImpresionFinalizada += new EventHandler(util_ImpresionFinalizada);
            this.button1.Click += new RoutedEventHandler(button1_Click);
            this.button2.Click += util.Imprimir;
        }

        void button1_Click(object sender, RoutedEventArgs e)
        {
            util.Configurar();
        }

        void util_ImpresionFinalizada(object sender, EventArgs e)
        {
            MessageBox.Show("ok!!!");
        }

    }

En el constructor de la clase Impresion mandamos los parámetros necesarios los cuales son la fuente de datos, el DataTemplate que será usado para definir la distribución de los elementos, el alto que tendrá cada línea (corresponde al alto del registro que tiene el Grid del DataTemplate), el nombre que deseamos que aparezca en el panel de la impresora y el título deseado.

Además, con la siguiente línea:

this.button2.Click += util.Imprimir;

Estamos definiendo como manejador del evento Click del botón al método público Imprimir implementado en la clase Impresion.  Será en ese método en donde implementaremos la funcionalidad para mandar a imprimir nuestro contenido.

También cabe resaltar:

util.ImpresionFinalizada += new EventHandler(util_ImpresionFinalizada);

Con la línea anterior estamos manejando el evento ImpresionFinalizada, evento que ha sido implementado también en la clase Impresion y que se disparará una vez finalizado el proceso de impresión (efectivamente, en el evento EndPrint del objeto PrintDocument).  Lo interesante de este mecanismo es que si no establecemos un manejador para el evento, la clase impresión tiene el suyo propio: muestra un MessageBox cuando se está ejecutando adentro del navegador o muestra una ventana de Notificación (característica nueva en Silverlight 4) indicando que la impresión ha concluído.  El siguiente fragmento de código muestra este concepto:

….
            pd.EndPrint += (s, a) =>
            {
                this.paginaActual = 0;

                if (a.Error != null)
                    throw a.Error;
                if (ImpresionFinalizada != null)
                {
                    ImpresionFinalizada(this, null);
                }
                else
                {
                    Notificar();
                }
            };
            pd.Print();
        }

        void Notificar()
        {
            if (Application.Current.IsRunningOutOfBrowser)
            {
                NotificationWindow nw = new NotificationWindow();
                nw.Content = new TextBlock() { Text = "Impresión finalizada" };
                nw.Show(1000);
            }
            else
            {
                MessageBox.Show("Impresión finalizada");
            }
        }

 

Si ejecutamos la aplicación Fuera del Navegador, la notificación sería mostrada (quitando el manejador de evento personalizado de nuestro código):

image

Parametros.cs

 

La clase Parametros nos servirá para permitir al usuario que modifique los parámetros para la impresión, principalmente para el encabezado y el márgen izquierdo para el ItemsControl.  El mecanismo seleccionado para este efecto será tener un ChildWindow (llamado Configuracion) el cual contenga un control de tipo DataForm; para permitir la edición de los valores se una manera sencilla y rápida.  La siguiente figura muestra la caja de diálogo de configuración en acción:

image

Esto brinda al usuario una manera de poder cambiar algunos parámetros a la hora de imprimir.  El resultado será el siguiente (impresión a un archivo .xps):

image

Pueden descargar el código de aquí

Pueden ver el demo en vivo aquí (requiere Silverlight 4)

Write a comment

Spam Protection by WP-SpamFree