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

WPF自定义控件通过XPS打印为PDF时内容无法铺满页面如何解决

解决方案

问题根源

  1. 布局操作顺序错误:先完成控件的Measure/Arrange再设置FixedPage尺寸,后续布局更新未生效
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:24:02