2010-04-01 6 views
6

Je tente de créer des images de graphique sans jamais afficher ces graphiques à l'écran. Cela fait longtemps que je suis là et j'ai essayé beaucoup de choses différentes mais rien ne semble fonctionner. Le code fonctionne parfaitement si j'affiche d'abord le graphique dans une fenêtre, mais si je ne l'affiche pas dans une fenêtre, le bitmap est juste blanc avec une bordure noire (aucune idée pourquoi).ContentControl + RenderTargetBitmap + image vide

J'ai essayé d'ajouter le graphique à une bordure avant de le rendre et de donner à la bordure une bordure verte. Dans le bitmap, je vois la bordure verte puis la bordure noire et le fond blanc mais pas de graphique. Le tableau n'est pas contenu dans un tableau noir, donc je ne sais pas d'où ça vient.

J'ai essayé d'ajouter le graphique à une fenêtre sans appeler window.Show() et encore je viens d'obtenir le fond noir et blanc. Cependant si j'appelle window.Show() le bitmap contient le diagramme.

J'ai essayé d'utiliser un dessinVisuel comme expliqué here, même résultat.

Voici le code (non compris l'ajout de l'élément à une bordure ou d'une fenêtre):

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

Note: Le tableau est un ContentControl.

Y at-il de toute façon que je puisse obtenir le rendu du graphique sans l'afficher d'abord dans une fenêtre?

Répondre

5

L'appel à element.ApplyTemplate() a fait l'affaire.

+1

Ça ne marche pas pour moi. Où avez-vous inséré dans votre code le ApplyTemplate? –

+0

Désolé, cela fait deux ans que j'ai répondu à cette question et que je n'ai plus accès à ce code. Essayez de l'ajouter avant le UpdateLayout – Kelly

+0

Merci d'avoir posté la réponse. Tu m'as sauvé beaucoup d'ennuis! :) – ihake

1

Si quelqu'un a des problèmes similaires avec le rendu RenderTargetBitmap (obtenir image blanche/vide) articles qui sont StackPanel vous pouvez temporairement les déplacer vers Grille, puis rendre et remettre 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

Merci pour l'indice. J'ai trouvé un billet de blog à ce sujet ainsi que je l'ai documenté dans un autre thread SO: http://stackoverflow.com/questions/2522380/get-a-bitmap-image-from-a-control-view/28626055#28626055 –

1

Pour moi, l'appel à element.Arrange() était la pièce manquante.

+0

Moi aussi. Aucune des autres suggestions n'a fonctionné. – brianberns

Questions connexes