我试着而不会在屏幕上显示过的那些图表创建一些图表图像。我心中已经一直在这相当长的一段时间,尝试了很多不同的东西,但似乎没有任何工作。代码工作完美,如果我在一个窗口中首先显示的图表,但如果我没有在一个窗口中显示,位图只是白色的黑色的边框(不知道为什么)。

我已尝试加入该图表以一个边界呈现并给予边界绿色borderBrush之前。在该位图,我看到绿色borderBrush那么黑色边框和白色背景,但没有图。下图是不包含在一个黑色边框,所以我不知道那是来自你。

我曾尝试添加图表到一个窗口,而无需调用window.Show(),并再次我刚刚得到的黑色边框和白色背景。然而,如果我打电话window.Show()该位图包含图表。

我已经使用drawingVisual按此处的说明试图,同样的结果。

下面是代码(不包括添加元素到一个边界或窗口):

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中

反正我能得到图表呈现不先在窗口中显示它?

有帮助吗?

解决方案

调用element.ApplyTemplate()并获得成功。

其他提示

有关我,调用element.Arrange()是缺失的部件。

如果有人带有绘制在StackPanel中的 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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top