背景
我的 WinForms 应用程序中有一个大型报告,该报告生成到 WPFDrawingVisual
中。我想在一个单独的可调整大小的窗口中显示报告,使用户能够在阅读时向上/向下滚动。在这种情况下,报表没有任何分页符并且由一个大页面组成。
第一次尝试:
使用自定义DocumentViewer
来显示报告。
将自定义高度添加DrawingVisual
到FixedDocument
a 中,将 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;
}
}
我创建了一个包含DrawingGroup
从DrawingVisual
.
这种工作,但滚动时的性能很差。当报告足够大时,它甚至会崩溃。
解决方案?
我怎样才能更有效地DrawingVisual
在表格中绘制?我猜即使在启用滚动的面板中仅显示报告的一部分时,整体DrawingVisual
也会在 UserControl 中绘制。
或者,如何自定义DocumentViewer
或创建自己的 WPF 控件以显示DrawingVisual
.