将 Xceed DataGridControl 的图像复制到位图
Copy image of Xceed DataGridControl to bitmap
我正在使用 Xceed WPF 工具包(社区版)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 构造函数中,并为控件指定新的 width/height,但两者都在更大的 canvas 上产生了相同的图像。
有什么想法吗?
好的,我明白了....
最后的关键是在 DataGridControl.View 上禁用延迟加载...这是我的最终代码:
XAML:
<xcdg:DataGridControl x:Name="CEGrid">
<xcdg:DataGridControl.View>
<xcdg:TableflowView IsDeferredLoadingEnabled="False"/>
</xcdg:DataGridControl.View>
</xcdg:DataGridControl>
C# 代码隐藏:
双 tempWidth = CEGrid.ActualWidth;
双 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;
我正在使用 Xceed WPF 工具包(社区版)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 构造函数中,并为控件指定新的 width/height,但两者都在更大的 canvas 上产生了相同的图像。
有什么想法吗?
好的,我明白了....
最后的关键是在 DataGridControl.View 上禁用延迟加载...这是我的最终代码:
XAML:
<xcdg:DataGridControl x:Name="CEGrid">
<xcdg:DataGridControl.View>
<xcdg:TableflowView IsDeferredLoadingEnabled="False"/>
</xcdg:DataGridControl.View>
</xcdg:DataGridControl>
C# 代码隐藏: 双 tempWidth = CEGrid.ActualWidth; 双 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;