无法在后台生成图形(不显示UI)

问题描述 投票:0回答:1

我正在尝试在屏幕打开的背景中生成同步融合图表,从而能够将它们保存为 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),构建图例的控件已正确构建(使用绑定属性)。另一方面,图表始终是空的:没有数据或图形(条形或曲线)出现...

userControl variable filled

我不明白为什么?

欲了解更多信息:

  • 我尝试在 BeginInvoke 中以不同优先级(特别是渲染)使用 Dispatcher。它不会改变任何东西...
  • 图例构建正确,但图表构建错误,这确实令人惊讶。在这两种情况下,我都绑定到 GraphiqueSyntheseAAfficher 属性(在视图模型中),该属性是一个包含一组绑定到视图的属性的对象。对于图例来说,这很好,但以 png 格式保存的图像中的图形始终为空。

这个问题你有解决办法或者想法吗?

结果示例:

enter image description here

wpf charts syncfusion
1个回答
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!

© www.soinside.com 2019 - 2024. All rights reserved.