我试图创建一些图表图像而不在屏幕上显示这些图表。我已经在这方面工作了很长一段时间并尝试了很多不同的东西,但似乎没有任何工作。如果我首先在窗口中显示图表,代码可以正常工作,但如果我不在窗口中显示它,则位图只是带有黑色边框的白色(不知道为什么)。
我尝试在渲染之前将图表添加到边框,并为边框指定绿色borderBrush。在位图中,我看到绿色borderBrush然后是黑色边框和白色背景但没有图表。图表不包含在黑色寄宿生中,因此我不知道它来自何处。
我尝试将图表添加到窗口而不调用window.Show()并再次获得黑色边框和白色背景。但是,如果我调用window.Show(),则位图包含图表。
我尝试使用drawingVisual解释here,结果相同。
以下是代码(不包括将元素添加到边框或窗口):
private static BitmapSource CreateElementScreenshot(FrameworkElement element, int dpi)
{
if (!element.IsMeasureValid)
{
Size size = new Size(element.Width, element.Height);
element.Measure(size);
element.Arrange(new Rect(size));
}
element.UpdateLayout();
var scale = dpi/96.0;
var renderTargetBitmap = new RenderTargetBitmap
(
(int)(scale * element.RenderSize.Width),(int)(scale * element.RenderSize.Height),dpi,dpi,PixelFormats.Default
);
// this is waiting for dispatcher to perform measure, arrange and render passes
element.Dispatcher.Invoke(((Action)(() => renderTargetBitmap.Render(element))), DispatcherPriority.Render);
return renderTargetBitmap;
}
注意:图表是ContentControl。
无论如何,我可以让图表呈现而不先在窗口中显示它吗?
答案 0 :(得分:6)
调用element.ApplyTemplate()就可以了。
答案 1 :(得分:1)
如果某人在渲染 RenderTargetBitmap (获取白/空图像)项目时遇到类似问题,您可以暂时将其移至网格,然后渲染并将其放回 StackPanel
Grid grid = new System.Windows.Controls.Grid() { Background = Brushes.White, Width = iWidth, Height = iHeight };
Panel panel = plot.Parent as Panel;
if (panel != null)
{
panel.Children.Remove(plot);
grid.Children.Add(plot);
grid.Measure(new Size(iWidth, iHeight));
grid.Arrange(new Rect(new Size(iWidth, iHeight)));
}
plot.Measure(new Size(iWidth, iHeight));
plot.Arrange(new Rect(new Size(iWidth, iHeight)));
plot.ApplyTemplate();
plot.UpdateLayout();
grid.ApplyTemplate();
grid.UpdateLayout();
RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(
iWidth,
iHeight,
96, 96, PixelFormats.Pbgra32);
renderTargetBitmap.Render(grid);
PngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap));
MemoryStream memoryStream = new MemoryStream();
encoder.Save(memoryStream);
bitmap = new System.Drawing.Bitmap(memoryStream);
if (panel != null)
{
grid.Children.Remove(plot);
panel.Children.Add(plot);
}
plot.Measure(new Size(iWidthBefore, iHeightBefore));
plot.Arrange(new Rect(new Size(iWidthBefore, iHeightBefore)));
plot.UpdateLayout();
答案 2 :(得分:1)
对我来说,调用element.Arrange()是缺失的部分。