Silverlight - 打印
打印对于某些类型的应用程序来说是一项重要功能。 在本章中,我们将了解Silverlight中的相关功能。
打印 API,以及所有 Silverlight 应用程序想要打印时必须执行的基本步骤。 选择水印的多种选项。
最简单的方法是打印屏幕上已有的用户界面元素的副本。
大多数应用程序都希望比这更高级,并生成专门适合打印的内容,并且在某些情况下,有必要将内容拆分到多个页面上。
打印步骤
无论您是打印快照或屏幕上已有的内容,还是要进行完全自定义的多页打印输出,都需要相同的基本步骤。
打印 API 的核心是 PrintDocument 类。
您首先构建其中一个,当您调用其 Print 方法时,它会显示用于启动打印作业的标准用户界面。
![打印步骤](/silverlight/images/steps_for_printing.jpg)
用户可以照常选择打印机并配置设置。 如果用户随后决定单击打印继续,PrintDocument 将立即引发其 PrintPage 事件,并且该事件的处理程序提供要打印的内容。
事件参数为此目的提供了一个 PageVisual 属性。
您可以将其设置为任何 Silverlight 用户界面元素,可以是屏幕上已可见的元素,也可以是您专门为打印创建的新元素。
打印现有元素
元素 最简单的选项是打印 Silverlight 应用程序屏幕上已有的内容。 由于 PrintPage 事件参数 PageVisual 接受任何用户界面元素,因此您可以选择用户界面中的任何内容并将其打印。
与使用 PrintScreen 键抓取屏幕截图相比,这只是一小步。 它比这要好一些,因为用户不必手动将屏幕截图粘贴到其他程序中来裁剪和打印它。 这仍然只是一个微小的改进。
打印屏幕上已有的内容是有问题的。
首先,不能保证在屏幕上适用的布局也适用于纸张。
让我们看一个简单的示例,其中 ScrollViewer 包含一些 UI 元素及其适合屏幕的布局。 它根据浏览器窗口大小调整大小,并提供滚动条以确保即使不适合也可以访问所有内容。
下面给出的是 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>
这里是打印按钮点击事件实现,它将打印ScrollViewer及其可见数据。
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; } } }
如您所见,在创建 PrintDocument 对象的打印按钮单击事件中,我们将一个处理程序附加到其 PrintPage 事件。
您可以设置 PageVisual 属性来引用 ScrollViewer。
然后调用Print 方法。 这需要一个字符串,它将作为作业名称显示在打印队列中。
编译并执行上述代码后,您将看到以下输出。
![打印文档](/silverlight/images/print_document.jpg)
当您单击打印按钮时,您将看到标准的打印对话框。
![PrintDocument OneNote](/silverlight/images/printdocument_onenote.jpg)
现在,选择默认打印机。 为了演示目的,我们选择 OneNote 并单击打印按钮。 您将看到打印了 ScrollViewer。
![打印 ScrollViewer](/silverlight/images/print_scrollviewer.jpg)
请注意,滚动条在 ScrollViewer 上仍然可见。
自定义用户界面树
与打印屏幕上已有的内容相比,构建专门用于打印的用户界面元素树通常更有意义。 这样,您可以确保在纸张上仅使用非交互式元素,并且可以创建更适合纸张形状和尺寸的专用布局。 您可以创建一个仅用于打印的用户控件。
让我们看一个简单的示例,创建一个 Silverlight 项目并添加一个名为 PrintLayout 的 UserControl。
![PrintLayout](/silverlight/images/printlayout.jpg)
将设计时宽度和高度设置为近似纸张形状。 下面给出的是 PrintLayout.xaml 文件的 XAML 代码。
<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>
下面给出的是 MainPage.xaml 文件中的代码,其中仅包含一个打印按钮。
<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>
这是打印按钮的Click 事件实现。
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; } } }
编译并执行上述代码后,您将在网页上看到以下输出。
![打印按钮](/silverlight/images/print_button.jpg)
单击打印,然后选择OneNote打印布局。 您将看到布局已打印。
![选择 OneNote 进行打印](/silverlight/images/select_onenote_to_print.jpg)
您可以看到它已经填满了可用空间。 我们建议您执行上述示例以更好地理解。