You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:36