Silverlight - Stampa

La stampa è una funzionalità importante per alcuni tipi di applicazioni. In questo capitolo, esamineremo le strutture pertinenti in Silverlight.

  • API di stampa e passaggi di base che tutte le applicazioni Silverlight devono eseguire se desiderano stampare. Varie opzioni per la scelta della stampa ad acqua.

  • Il più semplice è stampare una copia degli elementi dell'interfaccia utente già presenti sullo schermo.

  • La maggior parte delle applicazioni vorrà diventare un po 'più avanzata di così e generare contenuti adattati specificamente per la stampa e, in alcuni casi, sarà necessario dividere il contenuto su più pagine.

Passaggi per la stampa

Sia che stiate stampando un'istantanea o qualcosa già sullo schermo, sia che stiate cercando un output di stampa multipagina completamente personalizzato, sono necessari gli stessi passaggi di base.

  • Il cuore dell'API di stampa è la classe PrintDocument.

  • Si inizia costruendo uno di questi e quando si chiama il suo metodo Print, viene visualizzata l'interfaccia utente standard per avviare un lavoro di stampa.

  • L'utente può selezionare una stampante e configurare le impostazioni come al solito. Se l'utente decide di procedere facendo clic suPrint, il PrintDocument alzerà immediatamente il suo PrintPage evento e il tuo gestore per quell'evento fornisce i contenuti da stampare.

  • L'argomento dell'evento offre a PageVisual proprietà per questo scopo.

  • È possibile impostarlo su qualsiasi elemento dell'interfaccia utente di Silverlight, uno già visibile sullo schermo o uno nuovo creato appositamente per la stampa.

Stampa di elementi esistenti

Elementi L'opzione più semplice è stampare il contenuto già visualizzato sullo schermo nell'applicazione Silverlight. Dal momento che ilPrintPage argomenti dell'evento PageVisual, accetta qualsiasi elemento dell'interfaccia utente, puoi scegliere qualsiasi cosa nella tua interfaccia utente e stamparla.

  • È solo un piccolo passo avanti rispetto all'utilizzo del tasto PrintScreen per acquisire uno screenshot. È leggermente migliore di così perché l'utente non deve incollare manualmente lo screenshot in qualche altro programma per ritagliarlo e stamparlo. È ancora solo un leggero miglioramento.

  • La stampa di contenuto già visualizzato sullo schermo è problematica.

  • Prima di tutto, non vi è alcuna garanzia che un layout che funzioni sullo schermo funzioni bene per la carta.

Diamo un'occhiata a un semplice esempio in cui il file ScrollViewercontiene alcuni elementi dell'interfaccia utente e il suo layout adattato allo schermo. Si ridimensiona in base alle dimensioni della finestra del browser e offre barre di scorrimento per garantire che tutto sia accessibile anche se non si adatta.

Di seguito è riportato il codice 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>

Ecco il file Print button implementazione dell'evento clic, che stamperà il file ScrollViewer e i suoi dati visibili.

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; 
      } 
   } 
}
  • Come puoi vedere, in Print button click event quello PrintDocument viene creato l'oggetto, colleghiamo un gestore al suo evento PrintPage.

  • Puoi impostare il file PageVisual proprietà a cui fare riferimento ScrollViewer.

  • Poi Print methodè chiamato. Ciò richiede una stringa, che verrà visualizzata come nome del lavoro nella coda di stampa.

Quando il codice sopra viene compilato ed eseguito, vedrai il seguente output.

Quando fai clic sul file Print , vedrai la finestra di dialogo standard di stampa.

Ora seleziona la stampante predefinita. A scopo dimostrativo, selezioniamoOneNote e fare clic su Printpulsante. Lo vedraiScrollViewer viene stampato.

Notare che le barre di scorrimento sono ancora visibili sul file ScrollViewer.

Struttura dell'interfaccia utente personalizzata

Invece di stampare il contenuto che è già sullo schermo, di solito ha più senso costruire un albero di elementi dell'interfaccia utente specificamente per la stampa. In questo modo, puoi assicurarti di utilizzare solo elementi non interattivi su carta e creare un layout specializzato più adatto alla forma e alle dimensioni della carta. È possibile creare un UserControl solo per la stampa.

Diamo un'occhiata a un semplice esempio creando un progetto Silverlight e aggiungiamo un file UserControl chiamato PrintLayout.

Impostare la larghezza e l'altezza del tempo di disegno in modo che siano approssimativamente a forma di carta. Di seguito è riportato il codice XAML diPrintLayout.xaml file.

<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>

Di seguito è riportato il codice nel file MainPage.xaml file, che contiene un file Print solo pulsante.

<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>

Ecco il file Click event implementazione per pulsante di stampa.

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; 
      } 
   } 
}

Quando il codice sopra è stato compilato ed eseguito, vedrai il seguente output sulla pagina web.

Clic Print e seleziona OneNoteper stampare il layout. Vedrai che il layout viene stampato.

Puoi vedere che ha riempito lo spazio disponibile. Ti consigliamo di eseguire gli esempi precedenti per una migliore comprensione.