Win10/UWP新特性系列—使用打印机

微软在Win10时代终于完成的设备系统的大统一,"56个民族,56支花……"(⊙o⊙)…,既然统一了,那么也就意味着API也统一了,所以在UWP中,我们就可以使用统一的打印API来为设备(包括移动设备)添加基于XAML的App打印功能。使用Windows.Graphics.Printing和Windows.UI.Xaml.Printing命名空间,就可以很方便的将打印功能添加到我们的应用中。

下面是个例子,我们需要打印一个购物清单,前台代码如下:

 1 <Page.Resources>
 2     <SolidColorBrush x:Key="MainColor" Color="#0067a6"/>
 3     <SolidColorBrush x:Key="LightColor" Color="#00abd8"/>
 4     <SolidColorBrush x:Key="buttonColor" Color="#f29c9c"/>
 5 </Page.Resources>
 6 <Page.BottomAppBar>
 7     <CommandBar>
 8         <AppBarButton x:Name="appbar_Printer" Label="打印" Click="appbar_Printer_Click">
 9             <AppBarButton.Icon>
10                 <BitmapIcon UriSource="Images/Printer.png"/>
11             </AppBarButton.Icon>
12         </AppBarButton>
13         <AppBarButton Icon="Contact" Label="客服"/>
14     </CommandBar>
15 </Page.BottomAppBar>
16
17 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
18     <StackPanel x:Name="sp_PrintArea">
19         <StackPanel HorizontalAlignment="Center">
20             <TextBlock Foreground="{StaticResource MainColor}" Text="购物清单"/>
21         </StackPanel>
22         <StackPanel >
23             <TextBlock Text="订单ID:G20150618094144234"/>
24             <Image  Margin="0,6" Source="Images/surface pro 3.PNG" />
25             <TextBlock Margin="0,6" Text="商品名称:Surface Pro3 I7(8G 512G) 中国版"/>
26             <TextBlock Margin="0,6" Text="数量:1"/>
27             <TextBlock Margin="0,6" Text="单价:13,988¥"/>
28             <Rectangle Margin="0,6" Height="1" Fill="{StaticResource LightColor}"/>
29         </StackPanel>
30         <StackPanel HorizontalAlignment="Center">
31             <TextBlock Foreground="{StaticResource MainColor}" Text="收货人信息"/>
32         </StackPanel>
33         <StackPanel >
34             <TextBlock Margin="0,6"  Text="收货人:Aran"/>
35             <TextBlock Margin="0,6" Text="联系电话:186****0081"/>
36             <TextBlock Margin="0,6" Text="地址:地球村 中国小分队 xxx号"/>
37         </StackPanel>
38     </StackPanel>
39 </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():设置要预览的页面

后台代码实现:

  1 public sealed partial class MainPage : Page
  2 {
  3     /// <summary>
  4     /// 使用PrintManage.GetForCurrentView()获取一个PrintManager对象
  5     /// PrintManage 打印机管理器是负责为Windows应用程序安排打印流
  6     /// 使用时必须调用PrintManager.GetForCurrentView()方法来返回特定于当前窗口的PrintManager
  7     /// </summary>
  8     PrintManager printmgr = PrintManager.GetForCurrentView();
  9
 10     /// <summary>
 11     /// PrintDocument 将打印流发送到打印机的一个可重用对象
 12     /// </summary>
 13     PrintDocument printDoc = null;
 14
 15     /// <summary>
 16     /// RotateTransform 是来旋转打印元素的,如果设备是横着的则需要旋转90°
 17     /// </summary>
 18     RotateTransform rottrf = null;
 19
 20     /// <summary>
 21     /// 表示包括要打印的内容以及提供对描述将如何打印内容的信息的访问的打印操作
 22     /// </summary>
 23     PrintTask task = null;
 24
 25     public MainPage()
 26     {
 27         this.InitializeComponent();
 28         //当发生打印的请求时,通过 ShowPrintUIAsync方法通过编程方式调用打印,或通过用户操作可能会触发此事件
 29         printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
 30     }
 31
 32     private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
 33     {
 34         //从参数的Request属性中获取与PrintTaskRequest的任务关联
 35         //创建好打印内容和任务后 在调用Complete方法进行打印
 36         var deferral = args.Request.GetDeferral();
 37         // 创建打印任务
 38         task = args.Request.CreatePrintTask("购物信息-打印单", OnPrintTaskSourceRequrested);
 39         task.Completed += PrintTask_Completed;
 40         deferral.Complete();
 41     }
 42
 43     private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
 44     {
 45         //打印完成
 46     }
 47
 48     private async void OnPrintTaskSourceRequrested(PrintTaskSourceRequestedArgs args)
 49     {
 50         var def = args.GetDeferral();
 51         await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
 52             () =>
 53             {
 54                 // 设置打印源
 55                 args.SetSource(printDoc?.DocumentSource);
 56             });
 57         def.Complete();
 58     }
 59
 60     private async void appbar_Printer_Click(object sender, RoutedEventArgs e)
 61     {
 62         if (printDoc != null)
 63         {
 64             printDoc.GetPreviewPage -= OnGetPreviewPage;
 65             printDoc.Paginate -= PrintDic_Paginate;
 66             printDoc.AddPages -= PrintDic_AddPages;
 67         }
 68         this.printDoc = new PrintDocument();
 69         //订阅预览事件
 70         printDoc.GetPreviewPage += OnGetPreviewPage;
 71         //订阅预览时 打印参数发生变化事件 比如文档方向
 72         printDoc.Paginate += PrintDic_Paginate;
 73         //添加页面处理事件
 74         printDoc.AddPages += PrintDic_AddPages;
 75
 76         // 显示打印对话框
 77         bool showPrint = await PrintManager.ShowPrintUIAsync();
 78     }
 79
 80     //添加打印页面的内容
 81     private void PrintDic_AddPages(object sender, AddPagesEventArgs e)
 82     {
 83         //增加一个页要打印的元素
 84         printDoc.AddPage(sp_PrintArea);
 85
 86         //完成对打印页面的增加
 87         printDoc.AddPagesComplete();
 88     }
 89
 90     private void PrintDic_Paginate(object sender, PaginateEventArgs e)
 91     {
 92         PrintTaskOptions opt = task.Options;
 93         // 根据页面的方向来调整打印内容的旋转方向
 94         switch (opt.Orientation)
 95         {
 96             case PrintOrientation.Default:
 97                 rottrf.Angle = 0d;
 98                 break;
 99             case PrintOrientation.Portrait:
100                 rottrf.Angle = 0d;
101                 break;
102             case PrintOrientation.Landscape:
103                 rottrf.Angle = 90d;
104                 break;
105         }
106
107         // 设置预览页面的总页数
108         printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
109     }
110
111     private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
112     {
113         // 设置要预览的页面
114         printDoc.SetPreviewPage(e.PageNumber, sp_PrintArea);
115     }
116 }

效果如下:

推荐一个UWP开发群:53078485 大家可以进来一起学习

时间: 2024-08-30 07:43:01

Win10/UWP新特性系列—使用打印机的相关文章

Win10/UWP新特性系列—Launcher实现应用间的通信

UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如今,微软丰富了Launcher的功能,使用新的Launcher我们可以在App中实现调用文件资源管理器.App-To-App Server(应用对应用服务),Background Task Server App(后台任务处理服务App)还有设置页面调用. 一:Launcher.LaunchFolde

Win10/UWP新特性系列-GetPublisherCacheFolder

微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的数据是不会被别的App获取到的. 在UWP中,微软新增了GetPublisherCacheFolder —— 共享存储文件夹的机制,这个获取的共享存储文件夹并不是说打破了原有的"沙盒机制",而是指,同一个软件开发商发布的App之间,是允许访问一个共享的文件夹以及里面的内容.例如,多个应用程

Win10/UWP新特性系列—电池报告

UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的电池API,你可以了解到正在运行的设备所有的电池详细信息. 通过创建Battery对象来表示单个电池控制器或聚合的所有电池控制器,然后使用GetReport方法返回BatteryReport对象,该对象可指示响应电池的充电.容量和状态. 需要用到的资源: Battery:提供该设备的电池控制器信息类

Win10/UWP新特性—Drag&amp;Drop 拖出元素到其他App

在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop App & UWP App中.昨天重新研究了Win10 拖拽这一块,发现以前没能实现的功能,在正式版的环境下都可以实现了,做个笔记以防日后忘记. 在UWP中,想要拖动元素到Desktop或者另一个UWP App中,除了设置元素的CanDrag="True"我们要使用元素的DragSt

Win10/UWP新特性—SharedStorageAccessManager 共享文件

首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStorageAccessManager,它允许我们的App根据指定的文件生成一个FileToken来共享此文件,其他App可以使用SharedStorageAccessManager. RedeemTokenForFileAsync(fileToken);方法根据FileToken来获取到共享的文件.这样

atitit。win7 win8 win9 win10 win11 新特性总结与战略规划

atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 1 1.3. 很少损坏不能启动(只有一次,2年,多机) 1 1.4. PC也可以触摸 1 2. win8 新特性 2 2.1. 2012年2月29日 2 2.2. Metro界面跨平台(移动平台,) 2 2.3. 本文导航 2 2.4. U盘上也可运行 2 3. win9 新特性 3 3.1. wi

UWP/Win10新特性系列—App Service

Win10中,新增了一个很实用的新特性叫做App Service,App Service允许App不在前台运行的情况下提供出一个或多个对外服务供其他App使用,这看起来就好像Web开发中的Web Api. 通过对外提供服务的形式,可以使App更好的完成一些其他App所拥有的专业性操作,而不必自己再去实现服务所做的操作.一些企业用户可以提供复杂的服务,比如云识别和云存储来供开发者使用.这样使开发成本大大降低,也可以为服务提供商带来更多的用户.比如我们可以调用二维码识别服务(如下图,假设其他App提

UWP/Win10新特性系列—UserConsentVerifier

在UWP开发中,微软提供了新的用户许可验证方式-指纹(生物识别).Pin.密码验证.在爆料的新型Win10 Mobile移动设备中,会增加虹膜识别等先进的用户身份识别技术,微软现在统一了身份验证的API,将生物识别认证和传统的密码识别封装为系统API供开发者调用,调用者只需关心认证的结果,而无需担心用户使用的是虹膜识别还是指纹还是密码等其他的识别技术. 通过UserConsentVerifier类可以提高应用程序的安全性,例如,你可以授权应用程序的购买,或者访问受限制的资源之前需要指纹验证.下面

Atitit.业务系统的新特性&#160;开发平台&#160;新特性的来源总结

Atitit.业务系统的新特性 开发平台 新特性的来源总结 1.1. 语言新特性(java c# php js python lisp c++ oc swift ruby  go dart1 1.2. 流行lib.frmawork  新特性 jdk clr framework 新特性 (jq   Servlet2 1.3. Ide 新特性( eclipse vs netbea jetbrain2 1.4. Vm  新特性 clr  jvm(jvm好像没有独立的版本号,继承在jdk里面2 1.5.