WPF Rendern im Hintergrund
Wer mit der Klasse "RenderTargetBitmap" arbeitet und für den Benutzer unsichtbar eine Oberfläche rendern will, der ist vor Überraschungen nicht geschützt. Will man die Bilder als PNG oder als JPG speichern, so kann man völlig überraschend vor einem schwarzen Bild stehen und dieses wird sich auch nicht so einfach ändern.
Ursache dafür ist die Optimierung bzw. die Multithreading Politik von WPF. Wir können die nachlesen in der Beschreibung der UIElement.Measure Method
Layout updates happen asynchronously, such that the main thread is not waiting for every possible layout change. Querying an element via code-behind checking of property values may not immediately reflect changes to properties that interact with the element's sizing or layout characteristics (the Width property, for example).
Wollen wir also erfolgreich und sicher rendern, dann wäre dies im Falle eines Canvas genau der richtige Weg:
canvas.Arrange(new Rect(new System.Windows.Point(0, 0), new System.Windows.Size(height, width)));
canvas.UpdateLayout();
// render picture
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(canvas);
Damit verhindern wir MemoryLeaks durch Überreste in der Queue und zudem zwingen wir den Canvas über seinen Inhalt nachzudenken. Das folgende Speichern über einen BitmapEncoder wird mit Hilfe eines Streams zum Kinderspiel.