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

RenderTargetBitmap渲染未显示Grid报错:值不在预期范围的解决求助

问题解决:渲染未可视化Grid到PDF时的RenderTargetBitmap异常

问题原因

未可视化的Grid没有经过UWP的布局流程(Measure/Arrange),导致RenderTargetBitmap.RenderAsync无法获取有效的元素尺寸信息,进而抛出"Value does not fall within the expected range."异常。此外代码中存在拼写错误:scaledWhidth、scaledHeigh应为scaledWidth、scaledHeight,虽不直接引发异常,但需修正以避免逻辑问题。

解决方案

方案1:手动触发Grid的布局计算

在调用RenderAsync前,强制让Grid完成Measure和Arrange步骤,确保它有明确的尺寸信息:

private async Task<iText.Layout.Element.Image> SetImagePDF(Grid Page)
{
    var stream = new InMemoryRandomAccessStream();
    RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap();
    try
    {
        int DPI = 600;
        // 修正拼写错误
        double scaledWidth = (210 * DPI) / 25.4;
        double scaledHeight = (297 * DPI) / 25.4;

        // 手动触发Grid的布局流程
        Page.Measure(new Size(scaledWidth, scaledHeight));
        Page.Arrange(new Rect(0, 0, scaledWidth, scaledHeight));
        await Page.UpdateLayoutAsync();

        await renderTargetBitmap.RenderAsync(Page, (int)scaledWidth, (int)scaledHeight);
        IBuffer pixelBuffer = await renderTargetBitmap.GetPixelsAsync();
        byte[] pixels = pixelBuffer.ToArray();
        
        var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
        encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied,
                                (uint)renderTargetBitmap.PixelWidth,
                                (uint)renderTargetBitmap.PixelHeight,
                                DPI, DPI, pixels);
        await encoder.FlushAsync();
        
        stream.Seek(0);
        var imageBytes = new byte[stream.Size];
        await stream.AsStream().ReadAsync(imageBytes, 0, imageBytes.Length);
        
        ImageData imageData = ImageDataFactory.Create(imageBytes);
        return new iText.Layout.Element.Image(imageData);
    }
    catch (Exception e) 
    { 
        // 建议添加日志而非直接返回null,便于排查问题
        // Debug.WriteLine(e.ToString());
        return null; 
    }
}

方案2:限制渲染尺寸范围

如果scaledWidth/scaledHeight计算后超出RenderTargetBitmap支持的最大尺寸(UWP平台通常上限为16384x16384),可调整参数:

  • 降低DPI至300,此时A4尺寸约为2480x3508,远低于上限
  • 若必须600DPI,可确认平台支持的最大渲染尺寸,避免参数超出范围

方案3:使用Win2D替代RenderTargetBitmap(UWP专属)

Win2D的CanvasRenderTarget对未可视化XAML元素的渲染支持更稳定,可绕过布局依赖问题:

using Microsoft.Graphics.Canvas;
using Microsoft.Graphics.Canvas.UI.Xaml;

private async Task<iText.Layout.Element.Image> SetImagePDF(Grid Page)
{
    int DPI = 600;
    double scaledWidth = (210 * DPI) / 25.4;
    double scaledHeight = (297 * DPI) / 25.4;

    using (var canvasDevice = CanvasDevice.GetSharedDevice())
    using (var renderTarget = new CanvasRenderTarget(canvasDevice, (float)scaledWidth, (float)scaledHeight, DPI))
    {
        using (var ds = renderTarget.CreateDrawingSession())
        {
            ds.DrawElement(Page, new Rect(0, 0, scaledWidth, scaledHeight));
        }

        using (var stream = new InMemoryRandomAccessStream())
        {
            await renderTarget.SaveAsync(stream, CanvasBitmapFileFormat.Png);
            stream.Seek(0);
            var imageBytes = new byte[stream.Size];
            await stream.AsStream().ReadAsync(imageBytes, 0, imageBytes.Length);
            
            ImageData imageData = ImageDataFactory.Create(imageBytes);
            return new iText.Layout.Element.Image(imageData);
        }
    }
}

注意:使用Win2D需通过NuGet安装Microsoft.Graphics.Win2D包


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 04:22:36