2010-04-01 15 views
6

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?

Respuesta

5

Elemento de llamada.ApplyTemplate() hizo el truco.

+1

No funciona para mí. ¿Dónde insertó en su código el ApplyTemplate? –

+0

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

+0

Gracias por publicar la respuesta. ¡Me has ahorrado muchos problemas! :) – ihake

1

Si alguien tiene problemas similares con la representación RenderTargetBitmap (conseguir blanco/imagen vacía) elementos que están en StackPanel se les puede mover temporal para cuadrícula, 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(); 
+0

Gracias por la pista. Encontré una publicación en el blog sobre esto, así como lo he documentado en otro hilo SO: http://stackoverflow.com/questions/2522380/get-a-bitmap-image-from-a-control-view/28626055#28626055 –

1

Para mí, llamar al elemento.Arrange() era la pieza que faltaba.

+0

Yo también. Ninguna de las otras sugerencias funcionó. – brianberns

Cuestiones relacionadas