【问题标题】:Print From Apps (UWP)从应用程序打印 (UWP)
【发布时间】:2017-01-15 03:33:08
【问题描述】:

我想问一下如何打印我们自己的内容。例如,我们有一些表格,提交表格后,详细信息转到要打印的页面。然后打印。

我使用了来自https://github.com/Microsoft/Windows-universal-samples/blob/master/Samples/Printing/cs的示例。

但是当我尝试打印我的内容时,页面变成了空白页面。

我是 windows phone 开发和 c# 的新手。

【问题讨论】:

    标签: c# printing uwp


    【解决方案1】:

    official sample 包含许多复杂的打印功能。直接替换样本的某些内容可能效果不佳。我在这里有一个可以满足打印要求的示例演示。并且只需将PrintArea Grid 中的内容替换为您自己的,示例可以打印您的内容。

    XAML 代码

    <Page.BottomAppBar>
        <CommandBar>
            <AppBarButton x:Name="appbar_Printer"
                          Click="appbar_Printer_Click"
                          Label="printer">       
            </AppBarButton>
        </CommandBar>
    </Page.BottomAppBar>
    
    <Grid Background="White" x:Name="PrintArea" >
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="36"
                   Foreground="Black"
                   Text="Welcome Printed World!" />
    </Grid>
    

    后面的代码:

      PrintManager printmgr = PrintManager.GetForCurrentView();        
      PrintDocument printDoc = null;         
      PrintTask task = null; 
      public MainPage()
      {
          this.InitializeComponent(); 
          printmgr.PrintTaskRequested += Printmgr_PrintTaskRequested;
      }
      private void Printmgr_PrintTaskRequested(PrintManager sender, PrintTaskRequestedEventArgs args)
      {  
          var deferral = args.Request.GetDeferral(); 
          task = args.Request.CreatePrintTask("Print", OnPrintTaskSourceRequrested);
          //task.Completed += PrintTask_Completed;
          PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(task.Options);    
          deferral.Complete();
      } 
      //private void PrintTask_Completed(PrintTask sender, PrintTaskCompletedEventArgs args)
      //{
      //    //Completed
      //}
      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(this);
          printDoc.AddPagesComplete();
      }       
      private void PrintDic_Paginate(object sender, PaginateEventArgs e)
      {
          PrintTaskOptions opt = task.Options;
          PrintTaskOptionDetails printDetailedOptions = PrintTaskOptionDetails.GetFromPrintTaskOptions(e.PrintTaskOptions);
          printDoc.SetPreviewPageCount(1, PreviewPageCountType.Final);
      }
      private void OnGetPreviewPage(object sender, GetPreviewPageEventArgs e)
      {
            printDoc.SetPreviewPage(e.PageNumber, PrintArea); 
      }    
    

    如果您有更多要求,例如需要更多print options,请参考official document以及官方示例。

    【讨论】:

    • 非常感谢。就像我正在寻找的一样。 :)
    猜你喜欢
    • 2018-04-09
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多