I’ve been playing around with WPF animation, and ended up wanting to take a snapshot of an animation at a specific place.
Specifically, I have a canvas that has some pictures on it that are moving, and I want to be able to save a bitmap of what it looks like at a specific time.
Getting the bitmap is pretty easy, using a RenderTargetBitmap and a VisualBrush.
private BitmapSource CaptureScreen(Visual target)
Rect bounds = VisualTreeHelper.GetDescendantBounds(target);
RenderTargetBitmap renderBitmap = new RenderTargetBitmap(800, 600, 96, 96, PixelFormats.Pbgra32);
DrawingVisual dv = new DrawingVisual();
using (DrawingContext ctx = dv.RenderOpen())
VisualBrush vb = new VisualBrush(target);
ctx.DrawRectangle(vb,null, new Rect(new Point(), bounds.Size));
That gives you the state of the objects pre-animation, but what I really wanted was the state of the objects during the animation. I had some code to move the image around:
DoubleAnimationanim = new DoubleAnimation(50, 400, TimeSpan.FromSeconds(10), FillBehavior.HoldEnd);
AnimationClock clock = anim.CreateClock();
After a bit of research, I settled on the following bit of code to set the animation to the point that I wanted:
Which should have worked fine, but didn’t. When I looked at the properties, I noticed that the Left property was changing, but it wasn’t showing up. It was almost as if the Canvas didn’t know that the object property had changed and a re-layout was necessary…
was the magic incantation to make that happen.
(Note that I’m a novice at WPF, and there may be a better way to do this…)