我正在尝试在屏幕打开的背景中生成同步融合图表,从而能够将它们保存为 PNG 格式。
每个图表都位于带有自定义图例(不是合成图例)的用户控件中。所以我必须生成这个 UserControl,其中包含图表(SfCharts)及其关联的图例,然后将其保存为 PNG 格式。
我特别使用了这些说明:
private void GenerateGraphImage(object graphiqueBar, GraphiqueSynthese graphique)
{
// binded property containing with some chart's datas
GraphiqueSyntheseAAfficher = graphique;
// try to force render user control
if (graphiqueBar is UserControl userControl)
{
userControl.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
userControl.Arrange(new Rect(userControl.DesiredSize));
userControl.UpdateLayout();
// get image
var image = ScreenshotHelper.GetImage(userControl);
// save as png
SaveImage(image, graphique.GraphiqueName);
}
}
public static RenderTargetBitmap GetImage(UserControl view)
{
Size size = new Size(view.ActualWidth, view.ActualHeight);
if (size.IsEmpty)
return null;
RenderTargetBitmap result = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96, 96, PixelFormats.Pbgra32);
DrawingVisual drawingvisual = new DrawingVisual();
using (DrawingContext context = drawingvisual.RenderOpen())
{
context.DrawRectangle(new VisualBrush(view), null, new Rect(new Point(), size));
context.Close();
}
result.Render(drawingvisual);
return result;
}
我可以在 UpdateLayout() 之后看到内存中内置的 UserControl(通过将鼠标悬停在“userControl”变量上),它有一个大小(ActualWidth 和 ActualHeight 不为 0),构建图例的控件已正确构建(使用绑定属性)。另一方面,图表始终是空的:没有数据或图形(条形或曲线)出现...
我不明白为什么?
欲了解更多信息:
这个问题你有解决办法或者想法吗?
结果示例:
如果有人正在寻找解决方案。
您需要等待图表呈现其元素(如条形图)。
我在强制渲染之后和之前添加了 Thread.Sleep(1000) 以将视觉效果保存为 png。它有效!
chart.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
chart.Arrange(new Rect(userControl.DesiredSize));
Thread.Sleep(900);
// and save as png
非常感谢评论中的Gerry!