Silverlight - Impresión
La impresión es una capacidad importante para ciertos tipos de aplicaciones. En este capítulo, veremos las instalaciones relevantes en Silverlight.
API de impresión y los pasos básicos que deben realizar todas las aplicaciones de Silverlight si desean imprimir. Varias opciones para elegir la impresión de agua.
La más simple es imprimir una copia de los elementos de la interfaz de usuario que ya están en la pantalla.
La mayoría de las aplicaciones querrán ser un poco más avanzadas y generar contenido adaptado específicamente para impresión y, en algunos casos, será necesario dividir el contenido en varias páginas.
Pasos para imprimir
Ya sea que esté imprimiendo una instantánea o algo que ya esté en la pantalla, o si desea obtener una salida de impresión de varias páginas totalmente personalizada, se requieren los mismos pasos básicos.
En el corazón de la API de impresión se encuentra la clase PrintDocument.
Empiece por construir uno de estos, y cuando llama a su método Print, muestra la interfaz de usuario estándar para iniciar un trabajo de impresión.
El usuario puede seleccionar una impresora y configurar los ajustes como de costumbre. Si el usuario decide continuar haciendo clic enPrint, la PrintDocument levantará inmediatamente su PrintPage evento, y su controlador para ese evento proporciona el contenido que se imprimirá.
El argumento del evento ofrece una PageVisual propiedad para este propósito.
Puede configurarlo en cualquier elemento de la interfaz de usuario de Silverlight, ya sea uno que ya esté visible en la pantalla o uno nuevo que haya creado especialmente para imprimir.
Impresión de elementos existentes
Elementos La opción más sencilla es imprimir el contenido que ya está en pantalla en su aplicación Silverlight. Desde elPrintPage argumentos del evento PageVisual, acepta cualquier elemento de la interfaz de usuario, puede elegir cualquier elemento de su interfaz de usuario e imprimirlo.
Es solo un pequeño paso adelante de usar la tecla PrintScreen para tomar una captura de pantalla. Es ligeramente mejor que eso porque el usuario no tiene que pegar manualmente la captura de pantalla en algún otro programa para recortarla e imprimirla. Todavía es solo una pequeña mejora.
Imprimir contenido que ya está en pantalla es problemático.
En primer lugar, no hay garantía de que un diseño que funcione en pantalla funcione bien en papel.
Echemos un vistazo a un ejemplo sencillo en el que ScrollViewercontiene algunos elementos de la interfaz de usuario y su diseño adaptado a la pantalla. Cambia el tamaño en función del tamaño de la ventana del navegador y ofrece barras de desplazamiento para garantizar que todo sea accesible incluso si no encaja.
A continuación se muestra el código XAML.
<UserControl
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sdk = "http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
x:Class = "SilverlightPrinting.MainPage"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "500">
<Grid x:Name = "LayoutRoot" Background = "White">
<Button x:Name = "print" Content = "Print" Click = "print_Click" Width = "60"
Height = "20" Margin = "10,10,430,270"/>
<ScrollViewer x:Name = "myScrollViewer"
HorizontalScrollBarVisibility = "Auto"
VerticalScrollBarVisibility = "Auto"
Width = "400" Margin = "90,0,10,0">
<StackPanel>
<Rectangle Fill = "Gray" Width = "100" Height = "100" />
<Button x:Name = "button" Content = "Button" Width = "75"/>
<sdk:Calendar Height = "169" Width = "230"/>
<Rectangle Fill = "AliceBlue" Width = "475" Height = "100" />
</StackPanel>
</ScrollViewer>
</Grid>
</UserControl>
Aquí está el Print button implementación de evento de clic, que imprimirá el ScrollViewer y sus datos visibles.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace SilverlightPrinting {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void print_Click(object sender, RoutedEventArgs e) {
PrintDocument pd = new PrintDocument();
pd.PrintPage += new System.EventHandler<PrintPageEventArgs>(pd_PrintPage);
pd.Print("Print Screen Content");
}
private void pd_PrintPage(object sender, PrintPageEventArgs e) {
e.PageVisual = myScrollViewer;
}
}
}
Como puede ver, en Print button click event ese PrintDocument se crea un objeto, adjuntamos un controlador a su evento PrintPage.
Puede configurar el PageVisual propiedad para referirse a ScrollViewer.
Luego Print methodse llama. Esto toma una cadena, que aparecerá como el nombre del trabajo en la cola de impresión.
Cuando se compile y ejecute el código anterior, verá el siguiente resultado.
Cuando haces clic en el Print , verá el cuadro de diálogo Imprimir estándar.
Ahora, seleccione la impresora predeterminada. Para fines de demostración, seleccionemosOneNote y haga clic en el Printbotón. Verás esoScrollViewer está impreso.
Observe que las barras de desplazamiento todavía son visibles en el ScrollViewer.
Árbol de interfaz de usuario personalizado
En lugar de imprimir contenido que ya está en pantalla, normalmente tiene más sentido crear un árbol de elementos de la interfaz de usuario específicamente para imprimir. De esa manera, puede asegurarse de usar solo elementos no interactivos en papel y puede crear un diseño especializado que se adapte mejor a la forma y tamaño del papel. Puede crear un UserControl solo para imprimir.
Echemos un vistazo a un ejemplo simple creando un proyecto de Silverlight y agreguemos un UserControl llamado PrintLayout.
Establezca el ancho y alto del tiempo de diseño para que tengan aproximadamente forma de papel. A continuación se muestra el código XAML dePrintLayout.xaml archivo.
<UserControl x:Class = "PrintCustomUI.PrintLayout"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "768" d:DesignWidth = "960">
<Grid x:Name = "LayoutRoot" Background = "White">
<Grid.RowDefinitions>
<RowDefinition Height = "Auto" />
<RowDefinition />
<RowDefinition Height = "Auto" />
</Grid.RowDefinitions>
<TextBlock Text = "Silverlight" HorizontalAlignment = "Center"
FontSize = "60" FontWeight = "Bold" FontFamily = "Georgia" />
<TextBlock Grid.Row = "2" Text = "Print Testing"
HorizontalAlignment = "Center" FontFamily = "Georgia"
FontSize = "24" Margin = "0,10"/>
<Rectangle Grid.Row = "2" Height = "1" Fill = "Black"
VerticalAlignment = "Top"/>
<Ellipse Grid.Row = "1" Stroke = "Black" StrokeThickness = "10" Margin = "10">
<Ellipse.Fill>
<RadialGradientBrush
GradientOrigin = "0.2,0.2"
Center = "0.4,0.4">
<GradientStop Color = "Aqua" Offset = "0.006" />
<GradientStop Color = "AntiqueWhite" Offset = "1" />
</RadialGradientBrush>
</Ellipse.Fill>
</Ellipse>
</Grid>
</UserControl>
A continuación se muestra el código en el MainPage.xaml archivo, que contiene un Print botón solamente.
<UserControl x:Class = "PrintCustomUI.MainPage"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable = "d"
d:DesignHeight = "300" d:DesignWidth = "400">
<Grid x:Name = "LayoutRoot" Background = "White">
<Button Content = "Print..." Height = "23" HorizontalAlignment = "Left"
Margin = "12,28,0,0" Name = "printButton"
VerticalAlignment = "Top" Width = "75"
Click = "printButton_Click" />
</Grid>
</UserControl>
Aquí está el Click event Implementación para botón de impresión.
using System;
using System.Collections.Generic;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Printing;
namespace PrintCustomUI {
public partial class MainPage : UserControl {
public MainPage() {
InitializeComponent();
}
private void printButton_Click(object sender, RoutedEventArgs e) {
PrintDocument pd = new PrintDocument();
pd.PrintPage += new EventHandler<PrintPageEventArgs>(pd_PrintPage);
pd.Print("Custom");
}
void pd_PrintPage(object sender, PrintPageEventArgs e) {
var pl = new PrintLayout();
pl.Width = e.PrintableArea.Width;
pl.Height = e.PrintableArea.Height;
e.PageVisual = pl;
}
}
}
Cuando se compile y ejecute el código anterior, verá el siguiente resultado en la página web.
Hacer clic Print y seleccione OneNotepara imprimir el diseño. Verá que se imprime el diseño.
Puede ver que ha llenado el espacio disponible. Le recomendamos que ejecute los ejemplos anteriores para una mejor comprensión.