Pregunta

Im tratando de crear algunas imágenes de gráfico sin tener que mostrar los gráficos en la pantalla. I'v estado en esto durante bastante tiempo y trató de una gran cantidad de cosas diferentes, pero nada parece funcionar. El código funciona perfectamente si mostrar el gráfico en una ventana principio, pero si no lo mostrará en una ventana, el mapa de bits es sólo blanco con un borde negro (no sé por qué).

He intentado agregar el gráfico a una frontera antes de representar y dar la frontera un BorderBrush verde. En el mapa de bits, veo el BorderBrush verde, el borde negro y un fondo blanco, pero sin carta. El gráfico no está contenida en un huésped negro, así que no sé de dónde viene.

He intentado agregar el gráfico a una ventana sin llamar window.Show () y de nuevo me acaba de obtener el huésped negro y fondo blanco. Sin embargo si llamo window.Show () el mapa de bits contiene el gráfico.

He intentado usar un drawingVisual como se explica href="http://blogs.msdn.com/jaimer/archive/2009/07/03/rendertargetbitmap-tips.aspx" aquí , mismo resultado.

Este es el código (no incluyendo la adición del elemento a un borde o ventana):

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;
}

Nota:. El gráfico es un ContentControl

¿Hay alguna forma de conseguir la carta para rendir sin mostrarlo en una ventana por primera vez?

¿Fue útil?

Solución

Llamando element.ApplyTemplate () resolvieron el problema.

Otros consejos

Para mí, llamando element.Arrange () era la pieza que faltaba.

Si alguien tiene problemas similares con la representación RenderTargetBitmap (conseguir blanco / vacío de imagen ) elementos que están en StackPanel se les puede mover temporalmente a Red , a continuación, procesar y poner de nuevo en 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();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top