WPF自定义控件通过XPS打印为PDF时内容无法铺满页面如何解决
解决方案
问题根源
- 布局操作顺序错误:先完成控件的Measure/Arrange再设置FixedPage尺寸,后续布局更新未生效
- FixedPage本身不具备自动拉伸子元素的能力,未借助适配容器实现内容到页面尺寸的匹配
修正后代码
var controlViewModelsToPrint = new InfoControlViewModel[] { ViewModel }; // 8.5"x11" 标准打印尺寸,96DPI对应WPF单位 var xpsDPI = 96; var pageWidth = 8.5 * xpsDPI; var pageHeight = 11 * xpsDPI; var pageSize = new Size(pageWidth, pageHeight); var fixedDoc = new FixedDocument(); foreach (var controlViewModel in controlViewModelsToPrint) { var pageContent = new PageContent(); var fixedPage = new FixedPage { // 第一步先设置FixedPage的尺寸 Width = pageSize.Width, Height = pageSize.Height }; // 实例化自定义控件 var controlView = new InfoControl(controlViewModel) { HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Stretch, HorizontalContentAlignment = HorizontalAlignment.Stretch, VerticalContentAlignment = VerticalAlignment.Stretch }; // 用ViewBox包裹控件实现自动适配页面尺寸,Stretch属性可根据需求调整: // Fill:完全铺满,可能变形;Uniform:等比缩放,留空白;UniformToFill:等比铺满,裁切超出部分 var viewbox = new Viewbox { Child = controlView, Stretch = Stretch.Uniform, StretchDirection = StretchDirection.Both, Width = pageSize.Width, Height = pageSize.Height }; // 先加控件到FixedPage fixedPage.Children.Add(viewbox); // 按页面尺寸执行布局流程 fixedPage.Measure(pageSize); fixedPage.Arrange(new Rect(0, 0, pageSize.Width, pageSize.Height)); fixedPage.UpdateLayout(); // 关联PageContent和FixedPage ((IAddChild)pageContent).AddChild(fixedPage); fixedDoc.Pages.Add(pageContent); } PrintFixedDocument(fixedDoc);
额外配置说明
- 若需要完全铺满页面(允许内容轻微变形),可将
ViewBox.Stretch属性值修改为Stretch.Fill - 若需要保留打印边距,可在ViewBox外层嵌套Border控件,通过设置
Border.Margin属性调整边距大小 - 无需单独对自定义控件执行Measure/Arrange操作,交由父容器统一处理布局流程即可
内容的提问来源于stack exchange,提问作者Andy Stagg
相关产品推荐
相关产品推荐

