为何WPF窗口打印时受屏幕高度限制?打印内容遭截断
WPF窗口超出屏幕高度时打印内容截断的解决办法
当WPF窗口高度设置超过屏幕可用高度(比如屏幕高768,窗口设为1200),直接打印窗口可视化元素时,超出屏幕的部分因未被实际渲染会被截断。以下是两种可行的解决方法:
方法一:通过RenderTargetBitmap渲染完整窗口内容
这种方法会强制渲染窗口的全部尺寸内容,不受屏幕显示限制,适合任意结构的窗口:
private void PrintFullWindow() { // 创建与窗口尺寸匹配的位图渲染对象 var renderBitmap = new RenderTargetBitmap( (int)this.ActualWidth, (int)this.ActualHeight, 96d, 96d, PixelFormats.Pbgra32); // 用VisualBrush捕获整个窗口的视觉内容 var visualBrush = new VisualBrush(this); var drawingVisual = new DrawingVisual(); using (var drawingContext = drawingVisual.RenderOpen()) { drawingContext.DrawRectangle(visualBrush, null, new Rect(new Point(0, 0), new Size(this.ActualWidth, this.ActualHeight))); } // 将视觉内容渲染到位图 renderBitmap.Render(drawingVisual); // 执行打印流程 var printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { var printImage = new Image { Source = renderBitmap }; // 根据打印区域调整内容尺寸 printImage.Measure(new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight)); printImage.Arrange(new Rect(new Point(0, 0), printImage.DesiredSize)); printDialog.PrintVisual(printImage, "完整窗口打印"); } }
方法二:打印ScrollViewer的完整内容
如果窗口内容已经包裹在ScrollViewer中,可以直接打印其内容容器,确保完整渲染:
private void PrintScrollContent(ScrollViewer targetScrollViewer) { var printDialog = new PrintDialog(); if (printDialog.ShowDialog() == true) { // 查找ScrollViewer的内容容器 var contentPresenter = FindVisualChild<ScrollContentPresenter>(targetScrollViewer); if (contentPresenter != null) { // 强制测量并排列完整内容 contentPresenter.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); contentPresenter.Arrange(new Rect(0, 0, contentPresenter.DesiredSize.Width, contentPresenter.DesiredSize.Height)); printDialog.PrintVisual(contentPresenter, "滚动内容完整打印"); } } } // 辅助方法:遍历视觉树查找子元素 private T FindVisualChild<T>(DependencyObject parent) where T : DependencyObject { for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++) { var child = VisualTreeHelper.GetChild(parent, i); if (child is T typedChild) return typedChild; var foundChild = FindVisualChild<T>(child); if (foundChild != null) return foundChild; } return null; }
注意事项
- 方法一需注意大尺寸窗口的内存占用,若窗口高度过大可分块处理。
- 打印前可在打印对话框中调整页面缩放比例,避免内容超出打印纸边界。
- 确保打印时窗口的所有数据已加载完成,避免空白或未渲染的内容。
内容的提问来源于stack exchange,提问作者alex corsega
相关产品推荐
相关产品推荐

