打印是某些应用程序的重要功能.在本章中,我们将查看Silverlight中的相关工具.
打印API,以及所有Silverlight的基本步骤应用程序必须执行,如果他们想要打印.选择水印的各种选项.
最简单的方法是打印屏幕上已有的用户界面元素的副本.
大多数应用程序都希望获得比这更高级的内容,并生成专门用于打印的内容,在某些情况下,有必要将内容拆分为多个页面./p>
无论是打印快照还是已在屏幕上显示的内容,对于完全自定义的多页打印输出,需要相同的基本步骤.
打印API的核心是PrintDocument类.
首先构建其中一个,当您调用其Print方法时,它会显示用于启动打印作业的标准用户界面.
用户可以选择打印机并照常配置设置.如果用户然后通过单击打印决定继续, PrintDocument 将立即引发其 PrintPage 事件,并且该事件的处理程序提供要打印的内容.
为此,event参数提供了 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 .
然后调用打印方法.这需要一个字符串,它将显示为打印队列中的作业名称.
编译并执行上述代码时,你会看到以下输出.
当你点击打印按钮,您将看到标准的打印对话框.
现在,选择默认打印机.出于演示目的,我们选择 OneNote 并单击打印按钮.您将看到 ScrollViewer 已打印.
请注意,滚动条仍然可以在 ScrollViewer 上看到.
打印已经在屏幕上的内容,通常更有意义的是构建专门用于打印的用户界面元素树.这样,您可以确保仅在纸张上使用非交互元素,并且可以创建更适合纸张形状和大小的专用布局.您可以创建一个仅用于打印的UserControl.
让我们看一个简单的例子,创建一个Silverlight项目并添加一个名为 PrintLayout的 UserControl .
设置设计时间宽度和高度约为纸形.下面给出了 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; } } }
编译并执行上述代码时,您将在Web上看到以下输出页面.
点击打印并选择 OneNote 打印布局.您将看到打印布局.
您可以看到它已填满可用空间.我们建议您执行上述示例以便更好地理解.