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

如何通过编程将超宽GridView完整转换为单张bitmap位图图像

WPF宽幅RadGridView完整转位图实现方案

核心原理

默认RadGridView受父容器尺寸限制,会开启滚动和虚拟化仅渲染可视区域内容。要生成完整内容的位图,需要先手动测量排列控件,让所有行、列完全展开后再执行渲染。必须关闭行和列的虚拟化,否则不可见区域的内容会缺失。

实现步骤

  • 为RadGridView关闭行、列虚拟化,禁用滚动条避免布局干扰
  • 临时将控件尺寸设为自动,传入无限大尺寸完成测量和排列,让所有内容完整展开
  • 创建对应尺寸的渲染位图,将控件渲染到位图对象
  • 还原控件原本的尺寸设置,不影响界面原有显示

代码示例

XAML调整

<StackPanel>
    <telerik:RadGridView x:Name="GridView1" 
                         ItemsSource="{Binding MyProperties1}" 
                         AutoGenerateColumns="True"
                         EnableRowVirtualization="False"
                         EnableColumnVirtualization="False"
                         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                         ScrollViewer.VerticalScrollBarVisibility="Disabled"/>
    <telerik:RadGridView x:Name="GridView2" 
                         ItemsSource="{Binding MyProperties2}" 
                         AutoGenerateColumns="True"
                         EnableRowVirtualization="False"
                         EnableColumnVirtualization="False"
                         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                         ScrollViewer.VerticalScrollBarVisibility="Disabled"/>
</StackPanel>

转换逻辑C#代码

using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Telerik.Windows.Controls;

/// <summary>
/// 将单个RadGridView完整内容转换为位图
/// </summary>
public BitmapSource ConvertGridViewToBitmap(RadGridView gridView)
{
    // 保存原有尺寸配置,转换完成后还原
    var originalWidth = gridView.Width;
    var originalHeight = gridView.Height;

    try
    {
        // 设置为自动尺寸,让内容完全撑开
        gridView.Width = double.NaN;
        gridView.Height = double.NaN;

        // 传入无限大可用尺寸完成测量
        gridView.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        // 按测量得到的完整内容尺寸排列控件
        gridView.Arrange(new Rect(0, 0, gridView.DesiredSize.Width, gridView.DesiredSize.Height));
        // 强制更新布局确保所有内容渲染完成
        gridView.UpdateLayout();

        // 生成对应尺寸的位图,使用系统默认96DPI
        var renderBitmap = new RenderTargetBitmap(
            (int)gridView.ActualWidth,
            (int)gridView.ActualHeight,
            96, 96,
            PixelFormats.Pbgra32);
        renderBitmap.Render(gridView);
        renderBitmap.Freeze();

        return renderBitmap;
    }
    finally
    {
        // 还原控件原有尺寸
        gridView.Width = originalWidth;
        gridView.Height = originalHeight;
        gridView.UpdateLayout();
    }
}

/// <summary>
/// 合并两个GridView为同一张位图
/// </summary>
public BitmapSource MergeGridViewsToSingleBitmap(RadGridView topGrid, RadGridView bottomGrid)
{
    var topBmp = ConvertGridViewToBitmap(topGrid);
    var bottomBmp = ConvertGridViewToBitmap(bottomGrid);

    // 计算合并后总尺寸:宽度取两者最大值,高度为两者之和
    int totalWidth = (int)Math.Max(topBmp.Width, bottomBmp.Width);
    int totalHeight = (int)(topBmp.Height + bottomBmp.Height);

    // 绘制合并后的位图
    var drawingVisual = new DrawingVisual();
    using (var drawingContext = drawingVisual.RenderOpen())
    {
        drawingContext.DrawImage(topBmp, new Rect(0, 0, topBmp.Width, topBmp.Height));
        drawingContext.DrawImage(bottomBmp, new Rect(0, topBmp.Height, bottomBmp.Width, bottomBmp.Height));
    }

    var mergedBitmap = new RenderTargetBitmap(totalWidth, totalHeight, 96, 96, PixelFormats.Pbgra32);
    mergedBitmap.Render(drawingVisual);
    mergedBitmap.Freeze();

    return mergedBitmap;
}

注意事项

  • 关闭虚拟化后数据量过大时会占用较高内存,单表数据超过1万行建议分页拆分导出
  • 若生成的位图尺寸超出系统GDI渲染上限,建议拆分为多张子图或导出为PDF等矢量格式
  • 自定义单元格模板/样式需要确保在调用转换方法前已完成资源加载,避免出现渲染空白

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:18:03