UWP开发入门(二十四)—— Win10风格的打印对话框
虽然经常看到阿迪王发“看那个开发UWP的又上吊了”的图……还是忍不住重启一下这个系列。最近有用到UWP的print API,特地来写一篇给某软的这个伟大构想续一秒。
之前的打印对话框差不多长成这样:

而新的Win10风格打印对话框是下图的样子,包括预览图非常的直观。

首先让我们构建一个极简的UWP程序,太久没写的话说不定手都生了……
<Grid>
<Button Width="160" Height="80" Click="Button_Click" Background="Red">Print</Button>
</Grid>
我们试图在点击这个button时,通过PrintHelper类来显示打印对话框。
private async void Button_Click(object sender, RoutedEventArgs e)
{
var printHelper = new PrintHelper();
printHelper.PreparePrintContent(this);
await printHelper.ShowPrintUIAsync();
}
到这里就是MainPage的所有内容了。然后让我们去看PrintHelper的实现。
在构造函数中,我们需要创建Printdocument和PrintManger的实例,用来注册打印相关的事件。
public PrintHelper()
{
printDocument = new PrintDocument();
printDocumentSource = printDocument.DocumentSource;
//printDocument.Paginate += PrintDocument_Paginate;
printDocument.GetPreviewPage += PrintDocument_GetPreviewPage;
printDocument.AddPages += PrintDocument_AddPages; PrintManager printMan = PrintManager.GetForCurrentView();
printMan.PrintTaskRequested += PrintMan_PrintTaskRequested;
}
PrintDocument是对即将打印文档的映射,我们接下来会通过它来构建预览试图等相关信息。
printDocument.Paginate事件主要用于准备所有的预览页,该事件会在打印对话框显示时,被执行一次。如果是单页的打印该事件不处理也可以。
printDocument.GetPreviewPage事件会在显示具体的预览页时,被执行。例如供两页内容,用户前后翻页预览时,每个预览页就是由这里设置。
Sample代码里因为只有一页,所以就直接将PrintContent赋值过去了。
private void PrintDocument_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
{
PrintDocument printDoc = (PrintDocument)sender;
printDoc.SetPreviewPage(e.PageNumber, PrintContent);
}
printDocument.AddPages事件在实际打印操作发生时被触发,printDocument会通过AddPage和AddPageComplete方法来通完成文档的准备,然后进行打印操作。
private void PrintDocument_AddPages(object sender, AddPagesEventArgs e)
{
PrintDocument printDoc = (PrintDocument)sender;
printDoc.AddPage(PrintContent);
printDoc.AddPagesComplete();
}
完成以上事件注册以后,我们来看PrintManger,这个可以理解为之前WPF中PrintDialog的UWP版本。我们最终通过它来启动UI打印对话框。根据文档,首先我们必须调用PrintManager.GetForCurrentView()方法,该方法将返回当前活动UWP Window关联的PrintManager,然后我们需要注册事件printMan.PrintTaskRequested,这个事件会在打印操作发生时被触发。
private void PrintMan_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
{
PrintTask printTask = null;
printTask = args.Request.CreatePrintTask("", sourceRequested =>
{
sourceRequested.SetSource(printDocumentSource);
});
}
在这个事件里,一般会CreatePrintTask,然后做一些打印的配置,最后指定printDocumentSource。
PrintHelper里其余部分的代码,仅仅时简单的封装和参数传递:
public async Task ShowPrintUIAsync()
{
if (PrintManager.IsSupported())
{
await PrintManager.ShowPrintUIAsync();
}
} public virtual void PreparePrintContent(UIElement printContent)
{
PrintContent = printContent;
}
具体大家可以参考Github上的Sample code:
https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/PrintingSample
UWP开发入门(二十四)—— Win10风格的打印对话框的更多相关文章
- UWP开发入门(十四)—— UserControl中Adaptive UI的小技巧
本篇我们通过绘制一个非常简单的UserControl控件,来分享一下对Adaptive UI的理解及一些图形绘制的技巧. 现在流行的APP都少不了精致的用户头像,首先假设我们需要绘制如下的图形作为默认 ...
- UWP开发入门(十)——通过继承来扩展ListView
本篇之所以起这样一个名字,是因为重点并非如何自定义控件,不涉及创建CustomControl和UserControl使用的Template和XAML概念.而是通过继承的方法来扩展一个现有的类,在继承的 ...
- UWP开发入门(十六)——常见的内存泄漏的原因
本篇借鉴了同事翔哥的劳动成果,在巨人的肩膀上把稿子又念了一遍. 内存泄漏的概念我这里就不说了,之前<UWP开发入门(十三)——用Diagnostic Tool检查内存泄漏>中提到过,即使有 ...
- Java开发学习(二十四)----SpringMVC设置请求映射路径
一.环境准备 创建一个Web的Maven项目 参考Java开发学习(二十三)----SpringMVC入门案例.工作流程解析及设置bean加载控制中环境准备 pom.xml添加Spring依赖 < ...
- UWP开发入门(十二)——神器Live Visual Tree
很久以前,我们就有Snoop这样的工具实时修改.查看正在运行的WPF程序,那时候调个样式,修改个模板,相当滋润.随着历史的车轮陷进WP的泥潭中,无论WP7的Silverlight还是WP8.1的run ...
- UWP开发入门(十九)——10分钟学会在VS2015中使用Git
写程序必然需要版本控制,哪怕是个人项目也是必须的.我们在开发UWP APP的时候,VS2015默认提供了对微软TFS和Git的支持.考虑到现在Git很火,作为微软系的程序员也不得不学一点防身,以免被开 ...
- 仿酷狗音乐播放器开发日志二十四 选项设置窗体的实现(附328行xml布局源码)
转载请说明原出处,谢谢~~ 花了两天时间把仿酷狗的选项设置窗体做出来了,当然了只是做了外观.现在开学了,写代码的时间减少,所以整个仿酷狗的工程开发速度减慢了.今天把仿酷狗的选项设置窗体的布局代码分享出 ...
- BizTalk开发系列(二十四) BizTalk项目框架建议
Asp.NET有MVC框架,大部份的开发都是按照MVC进行的.BizTalk是面向消息的开发,不能完全采用分层的开发模式.而微软只提供了 BizTalk项目开发的基本策略,通过分析相关的Complex ...
- Android开发(二十四)——数据存储SharePreference、SQLite、File、ContentProvider
Android提供以下四种存储方式: SharePreference SQLite File ContentProvider Android系统中数据基本都是私有的,一般存放在“data/data/程 ...
随机推荐
- 用webpack构建一个常规项目,好处和坏处分析
最近项目改版,用webpack重新架构. 些许心得我会写几篇记录一下. 好处如下: 1.ES6语法用起来,babel-loader转义,各种新语法用起来. 2.import 语法写起来,webpack ...
- 第11讲-Java泛型和文件操作
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1.泛型 1.2.2.文件操作 2.具体内容 2.1.Java泛型 2.1.1.为什么需要泛型 我们发现在List中,底层是Object[ ]数 ...
- 反序列化JSON
本人编程生涯刚刚起步,以下是个人理解,如果有些不对的地方,请各位在评论区指出,如果有更详细的博客也可以推荐给我. 首先要根据JSON创建一个实体类,并且要实现Serializable接口,再创建一个J ...
- C# 表达式树遍历(二)
一.前言 上一篇我们对表达式树有了初步的认识,这里我们将对表达式树进行遍历,只有弄清楚了他的运行原理,我们才可以对他进行定制化修改. 表达式系列目录 C# 表达式树讲解(一) C# 表达式树遍历(二) ...
- java8新特性使用
一.接口的默认方法(允许接口有非抽象方法)Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 代码如下: interface ...
- Http 协议简略
用户在浏览器中输入一个网址并回车,浏览器会向服务器发送一个http请求,服务器端程序会接受这个请求,并对请求进行相应的处理,然后发送一个回应,浏览器收到回应,再把回应的内容显示到页面,这种请求—相应的 ...
- Centos第一次使用配置IP地址
1.vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改默认配置文件 TYPE=Ethernet BOOTPROTO=static #静态 可修改为[n ...
- charles 镜像工具
本文参考:charles 镜像工具 镜像工具会在你浏览指定网站时,把抓取到的文件克隆一份,并保存在你指定的路径下: 注意:如果你配置是www.aaa.com; 那么只会抓这个域名下的文件,这个域名如果 ...
- fscanf函数的用法
fscanf函数用法 简要介绍 fscanf()函数是格式化读写函数.它读取的对象是磁盘文件 函数原型: int fscanf(FILE * fp,char * format,...); 其中fp为文 ...
- 反射的应用、获取Class类实例
*准备工作: 包结构:* ======================= Person.java代码: package com.atguigu.java; public class Person { ...