微软在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(, PreviewPageCountType.Final);
} private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
// 设置要预览的页面
printDoc.SetPreviewPage(e.PageNumber, sp_PrintArea);
}
}

效果如下:

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

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

  1. 【转】Win10/UWP新特性系列—Web

    Internet Explorer Internet Explorer 在Windows 10 升级为Edge模式,是一种交互性和兼容性都很强的新型浏览器,该浏览器相比以前的版本更新了超过2000个操 ...

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

    UWP中,微软为Windows.System.Launcher启动器新增了很多的功能,以前只能启动App,打开指定扩展名文件,对uri协议的解析,以及当启动的应用没有安装时则会提示前往商店下载等. 如 ...

  3. Win10/UWP新特性系列-GetPublisherCacheFolder

    微软Windows Runtime App拥有很强的安全模型来防止不同App之间的数据获取和共享,也就是我们所说的"沙盒机制",每个App都运行在Windows沙盒中,App之间的 ...

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

    UWP中,新增了当节电模式开启时,App能获取到通知的API,通过响应电源条件的更改,比如咨询用户是否使用黑色背景等来帮助延长电池使用时间. 通过Windows.Devices.Power命名空间中的 ...

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

    在以前的文章中,写过微软新特性Drag&Drop,当时可能由于处于Win10预览版,使用的VS也是预览版,只实现了从桌面拖拽文件到UWP App中,没能实现从UWP拖拽元素到Desktop A ...

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

    首先先给大家推荐一个UWP/Win10开发者群:53078485  里面有很多大婶,还有很多学习资源,欢迎大家来一起讨论Win10开发! 在UWP开发中,微软提供了一个新的特性叫做SharedStor ...

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

    atitit.win7 win8 win9 win10  win11 新特性总结与战略规划 1. win7 1 1.1. 发布时间 2009年10月22日 1 1.2. 稳定性大幅提升,很少蓝屏死机 ...

  8. Java8新特性系列-默认方法

    Java8 Interface Default and Static Methods 原文连接:Java8新特性系列-默认方法 – 微爱博客 在 Java 8 之前,接口只能有公共抽象方法. 如果不强 ...

  9. Java8新特性系列-Lambda

    转载自:Java8新特性系列-Lambda – 微爱博客 Lambda Expressions in Java 8 Lambda 表达式是 Java 8 最流行的特性.它们将函数式编程概念引入 Jav ...

随机推荐

  1. 深入理解C++的动态绑定和静态绑定【转】

    转自:http://blog.csdn.net/chgaowei/article/details/6427731 为了支持c++的多态性,才用了动态绑定和静态绑定.理解他们的区别有助于更好的理解多态性 ...

  2. MariaDB链接超时优化

    查看mysql server超时时间: MariaDB [(none)]> use xspeeder; MariaDB [xspeeder]> show global variables ...

  3. 管道函数(%>%)很简单

    %>%来自dplyr包的管道函数,其作用是将前一步的结果直接传参给下一步的函数,从而省略了中间的赋值步骤,可以大量减少内存中的对象,节省内存 符号%>%,这是管道操作,其意思是将%> ...

  4. jQuery核心之 $

    参考jQuery官网API文档 $ 和 $() 的区别很重要: 1.$(document).ready() 和 $(document).load() 的 区别:     前者等到DOM准备好了之后就会 ...

  5. c语言期末复习题

    代码参考:<K&R> 1.单词计数 #include<stdio.h> #define IN 1 #define OUT 0 main() { int c, state ...

  6. == 区别 equals

    ==操作符专门用来比较值是否相等 int a=10; int b=10; 则 a==b, 返回 true. 但是, String a = new String("foo"); St ...

  7. Appium自动化测试1 - 安装部署

    主要参考文章“虫师”自动化部署教程,不过结合自己的一些情况记录此博客~ 1.准备安装包 1)jdk; 下载及安装过程省略,我下载的是jdk1.7版本. 2) adt&SDK; SDK下载的是e ...

  8. MVC部署到iis

    程序域功能->打开或关闭->iis信息服务及.net framework下的两个要勾选 1. 发布程序,以文件系统file system 的形式,发布到一个文件夹里    自定义-> ...

  9. 读javascript高级程序设计05-面向对象之创建对象

    1.工厂模式 工厂模式是一种常用的创建对象的模式,可以使用以下函数封装创建对象的细节: function CreatePerson(name,age){ var p=new Object(); p.n ...

  10. jedis,spring-redis-data 整合使用,版本问题异常以及解决。

    最近整合使用redis spring-redis 出现了一下问题 spring:3.2.4.RELEASE jedis: jedis  2.4.2 spring-data-redis: 1.5.2.R ...