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
相关产品推荐
相关产品推荐

