在Windows窗体中绘制大型DrawingVisual

时间:2013-09-04 10:30:15

标签: wpf winforms

背景

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

首次尝试:

使用自定义DocumentViewer显示报告。

DrawingVisual添加到具有自定义高度的FixedDocument中,将FixedDocument添加到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;
   }
}

我创建了一个UserControl,其中包含从DrawingGroup的{​​{1}}创建的图片。

这种作品,但滚动时的表现很糟糕。当报告足够大时,它甚至会崩溃。

解决方案吗

如何在表单中更有效地绘制DrawingVisual?我猜整个DrawingVisual将在UserControl中绘制,即使报表的一部分只显示在启用滚动的面板中。

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

0 个答案:

没有答案
相关问题