虽然经常看到阿迪王发 "看那个开发 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 Windows 关联的 PrintManager, 然后我们需要注册事件 printMan.PrintTaskRequested, 这个事件会在打印操作发生时被触发.
- private void PrintMan_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
- {
- PrintTask printTask = null;
- printTask = args.Request.CreatePrintTask("1", 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://www.cnblogs.com/manupstairs/p/11688656.html