【问题标题】:Copy image of Xceed DataGridControl to bitmap将 Xceed DataGridControl 的图像复制到位图
【发布时间】:2015-08-11 00:46:29
【问题描述】:

我正在使用 Xceed WPF Toolkit(社区版)DataGridControl,我想从控件创建位图(放在剪贴板上或保存到 png)。

我曾尝试使用 RenderBitmapTarget,但它只会复制在屏幕上呈现的控件(我的网格比屏幕大)。

我的 RenderBitmapTarget 代码如下所示:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32);
rtb.Render(control);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(rtb));
MemoryStream stream = new MemoryStream();
png.Save(stream);
Image image = Image.FromStream(stream);

我尝试指定更大的尺寸(都在 RenderTargetBitmap 构造函数中,并为控件指定新的宽度/高度,但两者都只是在更大的画布上产生了相同的图像。

有什么想法吗?

【问题讨论】:

  • 通过将网格宽度和高度设置为 Double.NaN 并在渲染之前调用 UpdateLayout,我现在可以以正确的大小渲染控件,但只渲染可见数据(我猜是由于数据虚拟化)

标签: c# wpf xceed-datagrid


【解决方案1】:

好吧,我想通了……

最后一个关键是禁用 DataGridControl.View 上的延迟加载...这是我的最终代码:

XAML:

<xcdg:DataGridControl x:Name="CEGrid">
     <xcdg:DataGridControl.View>
         <xcdg:TableflowView IsDeferredLoadingEnabled="False"/>
     </xcdg:DataGridControl.View>
 </xcdg:DataGridControl>

C# 代码隐藏: 双 tempWidth = CEGrid.ActualWidth; double tempHeight = CEGrid.ActualHeight;

CEGrid.Width = double.NaN;
CEGrid.Height = double.NaN;

CEGrid.UpdateLayout();

RenderTargetBitmap rtb = new RenderTargetBitmap((int)CEGrid.ActualWidth, (int)CEGrid.ActualHeight, 96, 96, PixelFormats.Pbgra32);

rtb.Render(CEGrid);

PngBitmapEncoder pbe = new PngBitmapEncoder();
pbe.Frames.Add(BitmapFrame.Create(rtb));
MemoryStream stream = new MemoryStream();
pbe.Save(stream);
System.Drawing.Bitmap image = (System.Drawing.Bitmap)System.Drawing.Image.FromStream(stream);

CEGrid.Width = tempWidth;
CEGrid.Height = tempHeight;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-20
    • 2015-08-20
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多