2011-05-03 3 views
10

Rendre un contrôle WPF à une image bitmap n'est pas une tâche triviale comme je l'ai découvert aujourd'hui. Comme je sais maintenant faire face à la marge de contrôle des parents est un problème, comme Rick Strahl a écrit dans son blogRendre un contrôle WPF "non visible" à une image bitmap

http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap

Jusqu'à présent, je suis en mesure de créer des bitmaps de tout contrôle qui est visible à l'intérieur d'une fenêtre, mais ce que je vraiment besoin de faire est de créer des bitmaps de contrôles invisibles. Je les crée simplement en code - formes simples comme rectangle et ellipse - et je veux les sauvegarder sous forme de bitmaps sur le disque. Pour moi, c'est un cauchemar personnel. Comme mes valeurs ActualHeight et ActualWidth sont toujours égales à 0, j'utilise à la place Height et Width. Mais tout ce que je reçois est une image vide dans la taille de mon contrôle.

Comment puis-je créer un bitmap de n'importe quel contrôle sans l'ajouter à une fenêtre visible?

Répondre

19

Les nouveaux éléments n'ont pas été mis en page. Vous devez appeler Measure and Arrange sur le contrôle avant de le rendre.

Canvas c = new Canvas(); 

Rectangle r = new Rectangle 
{ 
    Fill = Brushes.Orange, 
    Width = 200, 
    Height = 100 
}; 

Ellipse e = new Ellipse 
{ 
    Fill = Brushes.DodgerBlue, 
    Width = 100, 
    Height = 100 
}; 

Canvas.SetLeft(e, 150); 

c.Children.Add(r); 
c.Children.Add(e); 

var size = new Size(250,100); 
c.Measure(size); 
c.Arrange(new Rect(size)); 

RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32); 

bmp.Render(c); 

PngBitmapEncoder enc = new PngBitmapEncoder(); 
enc.Frames.Add(BitmapFrame.Create(bmp)); 

using(var s = File.OpenWrite("image.png")) 
    enc.Save(s); 
Questions connexes