背景
我在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
。