WPF FlowDocument打印第一段未在A4页面居中,仅半宽居中问题求助
问题分析与解决方案
你遇到的问题核心在于Section容器没有占满FlowDocument的整个页面宽度,导致你设置了TextAlignment.Center的Paragraph只是在Section的窄范围内居中,而非整个A4页面的宽度。
为什么会这样?
WPF中,Section默认的HorizontalAlignment是Left,宽度由内部内容自动决定,而不是撑满FlowDocument的页面宽度。所以你的第一段文字看起来像是在“页面一半宽度的中间”——其实它是相对于Section的宽度居中,而Section本身只占据了内容所需的宽度,没有延伸到页面两侧。
解决方案(两种可选)
方案1:移除多余的Section嵌套
如果你的打印内容不需要Section的分组功能,直接将Paragraph添加到FlowDocument的Blocks中即可,这样Paragraph会自动匹配FlowDocument的有效页面宽度(PageWidth减去左右PagePadding):
PrintDialog printDlg = new PrintDialog(); FlowDocument doc = new FlowDocument(); doc.PagePadding = new Thickness(10); doc.PageWidth = 794; // 修正为更准确的A4宽度(210mm = 794px @96DPI) // 直接添加第一段到doc.Blocks Paragraph p = new Paragraph(new Run(Setup.GUI_texts_collection[193] + " " + vInvoice.Id.ToString())); p.Margin = new Thickness(10); p.FontSize = 30; p.FontFamily = new FontFamily("Arial"); p.FontWeight = FontWeights.Bold; p.TextAlignment = TextAlignment.Center; doc.Blocks.Add(p); // 后续段落同样直接添加到doc.Blocks p = new Paragraph(new Run(this.Type_lbl.Content + ": " + this.TypeComboBox.Text)); p.Margin = new Thickness(5); p.FontSize = 20; p.FontFamily = new FontFamily("Arial"); p.FontWeight = FontWeights.Bold; doc.Blocks.Add(p); // ... 其余段落代码保持不变,都替换为doc.Blocks.Add(p) IDocumentPaginatorSource idpSource = doc; if (printDlg.ShowDialog() == true) { printDlg.PrintDocument(idpSource.DocumentPaginator, "Invoice " + vInvoice.Id.ToString()); }
方案2:让Section撑满页面宽度
如果你需要保留Section(比如后续要添加更多分组内容),只需给Section设置HorizontalAlignment.Stretch,让它占满FlowDocument的可用宽度:
// 创建Section后立即添加这行代码 Section sec = new Section(); sec.HorizontalAlignment = HorizontalAlignment.Stretch; // 关键:让Section撑满页面宽度 // 后续段落添加到sec.Blocks的代码保持不变 p = new Paragraph(new Run(Setup.GUI_texts_collection[193] + " " + vInvoice.Id.ToString())); // ... 段落属性设置 sec.Blocks.Add(p); // ... 其余段落代码不变
额外优化点
你代码中创建了FlowDocumentPageViewer docpv但没有使用它,这部分可以直接移除,不会影响打印功能。
内容的提问来源于stack exchange,提问作者Emilius
相关产品推荐
相关产品推荐

