直接打印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
相关产品推荐
相关产品推荐

