Silverlight 4 Beta – Impresión, Modularización y Parámetros
Posted on : 23-11-2009 | By : Rodrigo | In : Silverlight 4
Tags: Impresion, PrintDocument, Silverlight 4
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
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:
{
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:
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:
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):
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:
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):
Pueden descargar el código de aquí
Pueden ver el demo en vivo aquí (requiere Silverlight 4)



