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

直接打印WPF Grid时左右边框缺失问题求助

WPF Grid打印时1px边框缺失问题

问题描述

尝试打印包含标签、图片及子Grid的WPF Grid,窗口显示时标签左侧有1像素黑边框,但直接通过PrintDialog选择打印机打印时边框缺失;使用Microsoft Print to PDF生成PDF后再打印,边框显示正常。已尝试更换打印机、调整打印对话框缩放选项,问题仍存在。

打印触发代码如下:

var printDlg = new PrintDialog();

if (printDlg.ShowDialog() == true)
{
    ResultContentRowDefination.Height = new GridLength(603, GridUnitType.Pixel);
    Height = 1153;
    printDlg.PrintVisual(MainRowGrid, "Work Request");
    ResultContentRowDefination.Height = new GridLength(250, GridUnitType.Pixel);
    Height = 800;
}

解决方案

1. 开启设备像素对齐

在XAML中给带边框的标签或其容器添加SnapsToDevicePixels="True"和UseLayoutRounding="True",确保渲染时对齐设备像素,避免打印时因DPI差异丢失细边框:

<Label SnapsToDevicePixels="True" UseLayoutRounding="True" 
       BorderBrush="Black" BorderThickness="1,0,0,0" ... />

2. 转换边框单位适配打印机DPI

WPF屏幕默认DPI为96,而打印机DPI通常为300/600,1屏幕像素在打印机中可能因尺寸过小被舍去。通过代码转换单位适配打印机:

if (printDlg.ShowDialog() == true)
{
    // 获取打印机DPI
    var dpiX = printDlg.PrintTicket.PageResolution.X;
    
    // 把1屏幕像素转换为打印机对应的设备单位
    double borderThickness = 96.0 / dpiX;
    
    // 临时修改标签边框厚度
    yourLabel.BorderThickness = new Thickness(borderThickness, 0, 0, 0);
    
    ResultContentRowDefination.Height = new GridLength(603, GridUnitType.Pixel);
    Height = 1153;
    printDlg.PrintVisual(MainRowGrid, "Work Request");
    
    // 恢复原边框设置
    yourLabel.BorderThickness = new Thickness(1, 0, 0, 0);
    ResultContentRowDefination.Height = new GridLength(250, GridUnitType.Pixel);
    Height = 800;
}

3. 先渲染为位图再打印

通过RenderTargetBitmap将Grid渲染成位图后再打印,避免矢量渲染时的精度丢失:

if (printDlg.ShowDialog() == true)
{
    ResultContentRowDefination.Height = new GridLength(603, GridUnitType.Pixel);
    Height = 1153;
    
    // 渲染Grid到位图
    var renderBitmap = new RenderTargetBitmap(
        (int)MainRowGrid.ActualWidth,
        (int)MainRowGrid.ActualHeight,
        96, 96, PixelFormats.Pbgra32);
    renderBitmap.Render(MainRowGrid);
    
    // 创建Image控件承载位图
    var image = new Image { Source = renderBitmap };
    image.Measure(new Size(printDlg.PrintableAreaWidth, printDlg.PrintableAreaHeight));
    image.Arrange(new Rect(new Point(0, 0), image.DesiredSize));
    
    // 打印位图
    printDlg.PrintVisual(image, "Work Request");
    
    ResultContentRowDefination.Height = new GridLength(250, GridUnitType.Pixel);
    Height = 800;
}

4. 禁用打印机细线优化

部分打印机默认启用“细线优化”导致细边框被忽略,尝试在代码中禁用该选项:

// 禁用打印机细线优化(不同打印机参数可能有差异)
if (printDlg.PrintTicket.Features.ContainsKey("PageFineLineEnhancement"))
{
    printDlg.PrintTicket.PageFineLineEnhancement = PageFineLineEnhancement.None;
}

内容的提问来源于stack exchange,提问作者stratov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 16:22:53