0

背景

我的 WinForms 应用程序中有一个大型报告,该报告生成到 WPFDrawingVisual中。我想在一个单独的可调整大小的窗口中显示报告,使用户能够在阅读时向上/向下滚动。在这种情况下,报表没有任何分页符并且由一个大页面组成。

第一次尝试:

使用自定义DocumentViewer来显示报告。

将自定义高度添加DrawingVisualFixedDocumenta 中,将 FixedDocument 添加到 a 中FixedDocumentSequence,最后将文档序列传递到打印预览窗口(使用自定义 DocumentViewer)。

var previewWindow = new ReportPrintPreview(docSeq);
previewWindow.Show();

课程:

public class ReportPrintPreview : Window
{
   private readonly DocumentViewer docViewer;

   public ReportPrintPreview(IDocumentPaginatorSource doc)
   {
      docViewer = new CustomDocumentViewer();
      docViewer.Document = doc;
   }

   protected override void OnInitialized(EventArgs e)
   {
      base.OnInitialized(e);
      AddChild(docViewer);
   }
}

public class CustomDocumentViewer : DocumentViewer
{
   public CustomDocumentViewer()
   {
      ShowPageBorders = false;
   }

   protected override void OnPrintCommand()
   {
   }
}

这适用于大型报告并提供良好的性能,但我发现DocumentViewer限制的自定义可能性。例如,想要在工具栏中添加组合框并在调整窗口大小时控制报表的缩放。

第二次尝试:

使用常规 Windows 窗体并DrawingVisual使用ElementHost. 元素宿主放置在面板内以启用滚动。

var form = new ReportViewer(visual, pSize);
form.ShowDialog();

课程:

public partial class ReportViewer : System.Windows.Forms.Form
{

   public ReportViewer(DrawingVisual visual, Size size)
   {
      InitializeComponent();

      var wpfPanel = new WpfDrawingUserControl(visual);
      elementHost1.Width = size.Width;
      elementHost1.Height = size.Height;
      elementHost1.Child = wpfPanel;
   }
}

public class WpfDrawingUserControl : System.Windows.Controls.UserControl
{
   public WpfDrawingUserControl(DrawingVisual visual)
   {
      var image = new Image();
      image.Source = new DrawingImage(visual.Drawing);
      Content = image;
   }
}

我创建了一个包含DrawingGroupDrawingVisual.

这种工作,但滚动时的性能很差。当报告足够大时,它甚至会崩溃。

解决方案?

我怎样才能更有效地DrawingVisual在表格中绘制?我猜即使在启用滚动的面板中仅显示报告的一部分时,整体DrawingVisual也会在 UserControl 中绘制。

或者,如何自定义DocumentViewer或创建自己的 WPF 控件以显示DrawingVisual.

4

0 回答 0