微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能。使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中。
下面是个例子,我们需要打印一个购物清单,前台代码如下:
<Page.Resources> <SolidColorBrush x:Key="MainColor" Color="#0067a6"/> <SolidColorBrush x:Key="LightColor" Color="#00abd8"/> <SolidColorBrush x:Key="buttonColor" Color="#f29c9c"/> </Page.Resources> <Page.BottomAppBar> <CommandBar> <AppBarButton x:Name="appbar_Printer" Label="打印" Click="appbar_Printer_Click"> <AppBarButton.Icon> <BitmapIcon UriSource="Images/Printer.png"/> </AppBarButton.Icon> </AppBarButton> <AppBarButton Icon="Contact" Label="客服"/> </CommandBar> </Page.BottomAppBar> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel x:Name="sp_PrintArea"> <StackPanel HorizontalAlignment="Center"> <TextBlock Foreground="{StaticResource MainColor}" Text="购物清单"/> </StackPanel> <StackPanel > <TextBlock Text="订单ID:G20150618094144234"/> <Image Margin="0,6" Source="Images/surface pro 3.PNG" /> <TextBlock Margin="0,6" Text="商品名称:Surface Pro3 I7(8G 512G) 中国版"/> <TextBlock Margin="0,6" Text="数量:1"/> <TextBlock Margin="0,6" Text="单价:13,988¥"/> <Rectangle Margin="0,6" Height="1" Fill="{StaticResource LightColor}"/> </StackPanel> <StackPanel HorizontalAlignment="Center"> <TextBlock Foreground="{StaticResource MainColor}" Text="收货人信息"/> </StackPanel> <StackPanel > <TextBlock Margin="0,6" Text="收货人:Aran"/> <TextBlock Margin="0,6" Text="联系电话:186****0081"/> <TextBlock Margin="0,6" Text="地址:地球村 中国小分队 xxx号"/> </StackPanel> </StackPanel> </Grid>
需要用到的类:
- PrintManager: PrintManage 打印机管理器是负责为Windows应用程序安排打印流,使用时必须调用PrintManager.GetForCurrentView()方法来返回特定于当前窗口的PrintManager
- PrintDocument: PrintDocument 将打印流发送到打印机的一个可重用对象
- PrintTask: 表示包括要打印的内容以及提供对描述将如何打印内容的信息的访问的打印操作
- PrintManager. PrintTaskRequested : 当发生打印的请求时,通过 ShowPrintUIAsync方法通过编程方式调用打印,或通过用户操作可能会触发此事件
- PrintTaskRequest . CreatePrintTask (): 创建打印任务
- PrintTask . Completed : 打印完成事件
- PrintDocument . OnGetPreviewPage : 订阅打印预览事件
- PrintDocument . Paginate : 订阅预览时 打印参数发生变化事件 比如文档方向
- PrintDocument . AddPages : 添加页面处理事件
- PrintDocument . AddPage( UIElement pageVisual) : 添加打印页面,需要UI元素参数
- PrintDocument . SetPreviewPage (): 设置要预览的页面
后台代码实现:
public sealed partial class MainPage : Page { /// <summary> /// 使用PrintManage.GetForCurrentView()获取一个PrintManager对象 /// PrintManage 打印机管理器是负责为Windows应用程序安排打印流 /// 使用时必须调用PrintManager.GetForCurrentView()方法来返回特定于当前窗口的PrintManager /// </summary> PrintManager printmgr = PrintManager.GetForCurrentView(); /// <summary> /// PrintDocument 将打印流发送到打印机的一个可重用对象 /// </summary> PrintDocument printDoc = null; /// <summary> /// RotateTransform 是来旋转打印元素的,如果设备是横着的则需要旋转90° /// </summary> RotateTransform rottrf = null; /// <summary> /// 表示包括要打印的内容以及提供对描述将如何打印内容的信息的访问的打印操作 /// </summary> PrintTask task = null; public MainPage() { this.InitializeComponent(); //当发生打印的请求时,通过 ShowPrintUIAsync方法通过编程方式调用打印,或通过用户操作可能会触发此事件 printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested; } private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args) { //从参数的Request属性中获取与PrintTaskRequest的任务关联 //创建好打印内容和任务后 在调用Complete方法进行打印 var deferral = args.Request.GetDeferral(); // 创建打印任务 task = args.Request.CreatePrintTask("购物信息-打印单", OnPrintTaskSourceRequrested); task.Completed += PrintTask_Completed; deferral.Complete(); } private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args) { //打印完成 } private async void OnPrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args) { var def = args.GetDeferral(); await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { // 设置打印源 args.SetSource(printDoc?.DocumentSource); }); def.Complete(); } private async void appbar_Printer_Click(object sender, RoutedEventArgs e) { if (printDoc != null) { printDoc.GetPreviewPage -= OnGetPreviewPage; printDoc.Paginate -= PrintDic_Paginate; printDoc.AddPages -= PrintDic_AddPages; } this.printDoc = new PrintDocument(); //订阅预览事件 printDoc.GetPreviewPage += OnGetPreviewPage; //订阅预览时 打印参数发生变化事件 比如文档方向 printDoc.Paginate += PrintDic_Paginate; //添加页面处理事件 printDoc.AddPages += PrintDic_AddPages; // 显示打印对话框 bool showPrint = await PrintManager.ShowPrintUIAsync(); } //添加打印页面的内容 private void PrintDic_AddPages(object sender, AddPagesEventArgs e) { //增加一个页要打印的元素 printDoc.AddPage(sp_PrintArea); //完成对打印页面的增加 printDoc.AddPagesComplete(); } private void PrintDic_Paginate(object sender, PaginateEventArgs e) { PrintTaskOptions opt = task.Options; // 根据页面的方向来调整打印内容的旋转方向 switch (opt.Orientation) { case PrintOrientation.Default: rottrf.Angle = 0d; break; case PrintOrientation.Portrait: rottrf.Angle = 0d; break; case PrintOrientation.Landscape: rottrf.Angle = 90d; break; } // 设置预览页面的总页数 printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final); } private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e) { // 设置要预览的页面 printDoc.SetPreviewPage(e.PageNumber, sp_PrintArea); } }
效果如下: