2010-04-01 8 views
6

Ich versuche, einige Diagrammbilder zu erstellen, ohne diese Diagramme jemals auf dem Bildschirm anzuzeigen. Ich war schon eine ganze Weile dabei und probierte viele verschiedene Dinge aus, aber nichts scheint zu funktionieren. Der Code funktioniert perfekt, wenn ich das Diagramm zuerst in einem Fenster zeige, aber wenn ich es nicht in einem Fenster zeige, ist das Bitmap nur weiß mit einem schwarzen Rand (keine Ahnung warum).ContentControl + RenderTargetBitmap + leeres Bild

Ich habe versucht, das Diagramm zu einer Grenze Zugabe vor dem Rendern und der Grenze eine grüne BorderBrush geben. In der Bitmap sehe ich den grünen Rahmen, dann den schwarzen Rahmen und den weißen Hintergrund, aber kein Diagramm. Das Chart ist nicht in einem schwarzen Boarder enthalten, daher weiß ich nicht, woher das kommt.

Ich habe versucht, das Diagramm zu einem Fenster ohne Aufruf von window.Show() hinzufügen und wieder bekomme ich nur die schwarzen Boarder und weißen Hintergrund. Wenn ich jedoch window.Show() aufrufe, enthält die Bitmap das Diagramm.

Ich habe versucht, mit einer ZeichnungVisual wie erläutert here, das gleiche Ergebnis. Hier

ist der Code (ohne Hinzufügen des Elements zu einem Rand oder Fenster):

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

Anmerkung: Die Grafik eines Content ist.

Gibt es trotzdem ich das Diagramm, um es in einem Fenster zu machen bekommen kann zunächst ohne Anzeige?

Antwort

5

Aufruf element.ApplyTemplate() hat den Trick gemacht.

+1

Es funktioniert nicht für mich. Wo haben Sie den ApplyTemplate in Ihren Code eingefügt? –

+0

Sorry, es ist zwei Jahre her, dass ich das beantwortet habe und ich habe keinen Zugriff mehr auf diesen Code. Versuchen Sie es vor dem UpdateLayout hinzuzufügen – Kelly

+0

Vielen Dank für das Posten der Antwort. Du hast mir eine Menge Ärger erspart! :) – ihake

1

Wenn jemand ähnliche Probleme mit Rendering Rendertargetbitmap (immer weiß/leer Bild) Gegenstände, die in Stackpanel sind Sie sie Grid temporäre bewegen kann, dann machen und es in Stackpanel setzen

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

Danke für den Hinweis. Ich habe einen Blogeintrag darüber gefunden, den ich in einem anderen SO-Thread dokumentiert habe: http://stackoverflow.com/questions/2522380/get-a-bitmap-image-from-a-control-view/28626055#28626055 –

1

Für mich ruft element.Arrange() war das fehlende Stück.

+0

Ich auch. Keiner der anderen Vorschläge funktionierte. – brianberns