虽然常常看到阿迪王发“看谁人开发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("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://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/PrintingSample
来源:https://www.cnblogs.com/manupstairs/p/11688656.html |