Im tratando de crear algunas imágenes de gráficos sin mostrar esos gráficos en la pantalla. He estado en esto por bastante tiempo e intenté muchas cosas diferentes pero nada parece funcionar. El código funciona perfectamente si primero se muestra el gráfico en una ventana, pero si no lo visualizo en una ventana, el mapa de bits es simplemente blanco con un borde negro (no sé por qué).ContentControl + RenderTargetBitmap + imagen vacía
He intentado agregar el gráfico a un borde antes de renderizarlo y darle al borde un borde verde Brush. En el mapa de bits, veo el borderBrush verde, luego el borde negro y el fondo blanco, pero no el gráfico. El gráfico no está contenido en una frontera negra, así que no sé de dónde viene.
He intentado agregar el gráfico a una ventana sin llamar a window.Show() y de nuevo acabo de obtener la frontera negra y el fondo blanco. Sin embargo, si llamo a window.Show(), el mapa de bits contiene el gráfico.
He intentado usar un drawingVisual como se explica here, mismo resultado.
Aquí está 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.
¿De todos modos puedo hacer que el gráfico se visualice sin mostrarlo primero en una ventana?
No funciona para mí. ¿Dónde insertó en su código el ApplyTemplate? –
Lo siento, han pasado dos años desde que contesté esto y ya no tengo acceso a ese código. Intente agregarlo antes de UpdateLayout – Kelly
Gracias por publicar la respuesta. ¡Me has ahorrado muchos problemas! :) – ihake