ibcadmin 发表于 2019-10-17 09:44:09

UWP开发入门(二十四)—— Win10风格的打印对话框

<p>虽然常常看到阿迪王发“看谁人开发UWP的又吊颈了”的图……照旧不由得重启一下这个系列。最近有用到UWP的print API,专程来写一篇给某软的这个伟大构想续一秒。</p>
<p>之前的打印对话框差不多长成这样:</p>
<p><div align="center"></div></p>
<p>而新的Win10风格打印对话框是下图的样子,包罗预览图非常的直观。</p>
<p><div align="center"></div></p>
<p> 起首让我们构建一个极简的UWP程序,太久没写的话说不定手都生了……</p>

    <Grid>
      <Button Width="160" Height="80" Click="Button_Click" Background="Red">Print</Button>
    </Grid>

<p>我们试图在点击这个button时,通过PrintHelper类来体现打印对话框。</p>

      private async void Button_Click(object sender, RoutedEventArgs e)
      {
            var printHelper = new PrintHelper();
            printHelper.PreparePrintContent(this);
            await printHelper.ShowPrintUIAsync();
      }

<p> </p>
<p>到这里就是MainPage的全部内容了。然后让我们去看PrintHelper的实现。</p>
<p>在构造函数中,我们需要创建Printdocument和PrintManger的实例,用来注册打印相关的事故。</p>

      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;
      }

<p> </p>
<p>PrintDocument是对即将打印文档的映射,我们接下来会通过它来构建预览试图等相关信息。</p>
<p>printDocument.Paginate事故主要用于准备全部的预览页,该事故会在打印对话框体现时,被实验一次。假如是单页的打印该事故不处理也可以。</p>
<p>printDocument.GetPreviewPage事故会在体现具体的预览页时,被实验。比方供两页内容,用户前后翻页预览时,每个预览页就是由这里设置。</p>
<p>Sample代码里由于只有一页,所以就直接将PrintContent赋值已往了。</p>

      private void PrintDocument_GetPreviewPage(object sender, GetPreviewPageEventArgs e)
      {
            PrintDocument printDoc = (PrintDocument)sender;
            printDoc.SetPreviewPage(e.PageNumber, PrintContent);
      }

<p>printDocument.AddPages事故在现实打印操纵发生时被触发,printDocument会通过AddPage和AddPageComplete方法来通完成文档的准备,然后进行打印操纵。</p>

      private void PrintDocument_AddPages(object sender, AddPagesEventArgs e)
      {
            PrintDocument printDoc = (PrintDocument)sender;
            printDoc.AddPage(PrintContent);
            printDoc.AddPagesComplete();
      }

<p>完成以上事故注册以后,我们来看PrintManger,这个可以明白为之前WPF中PrintDialog的UWP版本。我们终极通过它来启动UI打印对话框。根据文档,起首我们必须调用PrintManager.GetForCurrentView()方法,该方法将返回当前运动UWP Window关联的PrintManager,然后我们需要注册事故printMan.PrintTaskRequested,这个事故会在打印操纵发生时被触发。</p>

      private void PrintMan_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
      {
            PrintTask printTask = null;
            printTask = args.Request.CreatePrintTask("1", sourceRequested =>
            {
                sourceRequested.SetSource(printDocumentSource);
            });
      }

<p> </p>
<p>在这个事故里,一样平常会CreatePrintTask,然后做一些打印的设置,末了指定printDocumentSource。</p>
<p>PrintHelper里别的部分的代码,仅仅时简单的封装和参数传递:</p>

      public async Task ShowPrintUIAsync()
      {
            if (PrintManager.IsSupported())
            {
                await PrintManager.ShowPrintUIAsync();
            }
      }

      public virtual void PreparePrintContent(UIElement printContent)
      {
            PrintContent = printContent;
      }

<p> </p>
<p>具体大家可以参考Github上的Sample code:</p>
<p>https://github.com/manupstairs/UWPSamples/tree/master/UWPSamples/PrintingSample</p>
<p> </p><br><br/><br/><br/><br/><br/>来源:<a href="https://www.cnblogs.com/manupstairs/p/11688656.html" target="_blank">https://www.cnblogs.com/manupstairs/p/11688656.html</a>
页: [1]
查看完整版本: UWP开发入门(二十四)—— Win10风格的打印对话框