无法在wpf中打印具有较大用户控件元素的固定文档

本文关键字:元素 控件 用户 文档 wpf 打印 | 更新日期: 2023-09-27 18:07:51

我正在尝试打印用户控件。我将用户控件作为固定文档中的框架元素传递。当用户控件很大时,它不会被完全打印,只打印一页,其余内容被截断。我拿不到剩下的几页了。我需要在多个页面连续打印固定文档,而不截断内容。

  public void PrintAllReceipts(object datatoprint, string resourceNameToUserControl)
         {
             var assembly = Assembly.GetEntryAssembly();
             string resourceName = resourceNameToUserControl;
             FrameworkElement elem;
             using (Stream stream = assembly.GetManifestResourceStream(resourceName))
             {
                 using (StreamReader reader = new StreamReader(stream))
                 {
                     elem = XamlReader.Parse(reader.ReadToEnd()) as FrameworkElement;
                 }
             }
             var data = datatoprint;
             elem.DataContext = data;

             //var pageSize = new Size(8.26 * 96, 11.69 * 96); // A4 page, at 96 dpi
             //FixedDocument fixedDoc = new FixedDocument();
             //PageContent pageContent = new PageContent();
             //FixedPage fixedPage = new FixedPage();
             //fixedDoc.DocumentPaginator.PageSize = pageSize;
             //fixedPage.Width = pageSize.Width;
             //fixedPage.Height = pageSize.Height;
             //Create first page of document
             //fixedPage.Children.Add(elem);
             //fixedPage.Measure(pageSize);
             //fixedPage.Arrange(new Rect(new Point(), pageSize));
             //fixedPage.UpdateLayout();
             //((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage);
             //fixedDoc.Pages.Add(pageContent);
        PrintDialog dial = new PrintDialog();
        PrintContinuous(elem);
           //List<FixedDocument > docss = GetFixedDocument(elem, dial);
           //foreach (FixedDocument docs in docss)
           //{
           //    dial.PrintDocument(docs.DocumentPaginator, "");
           //}
          //   ShowPrintPreview(docss);
         }

public static void PrintContinuous( FrameworkElement fe)
         {
             PrintDialog pd = new PrintDialog();
             bool? result = pd.ShowDialog();
             if (!result.HasValue || !result.Value) return;
             fe.Dispatcher.Invoke(new Action(() =>
             {
                 fe.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
                 fe.Arrange(new Rect(fe.DesiredSize));
                 fe.UpdateLayout();
             }), System.Windows.Threading.DispatcherPriority.Render);
             pd.PrintVisual(fe, ((String.IsNullOrWhiteSpace
             (fe.Name) ? "Temp" : fe.Name) + " PRINT"));
         }

无法在wpf中打印具有较大用户控件元素的固定文档

你需要对视觉效果进行分页。

你可以将控件转换为位图,然后将位图分割成适合页面的部分,将页面添加到FixedDocument中,并使用PrintDialog.PrintDocument将其发送到打印机。

请参阅这篇相当长的CodeProject文章,它完全涵盖了所需的过程和代码: