CSharpFeeds - All your C# feeds in one place.

Sponsors

Tuesday, February 27, 2007

Taking snapshots of WPF animation

by Eric Gunnerson via Eric Gunnerson's Compendium : CSharp on 2/27/2007 7:10:00 PM

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));
    }
    renderBitmap.Render(dv);

    return renderBitmap;
}

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:

    DoubleAnimation anim = new DoubleAnimation(50, 400, TimeSpan.FromSeconds(10), FillBehavior.HoldEnd);
    AnimationClock clock = anim.CreateClock();
    m_imageLeft.ApplyAnimationClock(
Canvas.LeftProperty, clock);

After a bit of research, I settled on the following bit of code to set the animation to the point that I wanted:

    clock.Controller.SeekAlignedToLastTick(TimeSpan.FromSeconds(5.0), TimeSeekOrigin.BeginTime);

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...

    m_canvas.UpdateLayout();

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...)

email it!bookmark it!digg it!

Original Post: Taking snapshots of WPF animation

Subscribe

New Feed

Product Spotlight

Recently Updated Sources

Legal Note

The content of the postings is owned by the respective author. CSharpFeeds is not responsible for the contents of the postings. This site is automatically generated and cannot be reviewed for abusive content. If you find abusive content on CSharpFeeds, please contact us. Designated trademarks and brands are the property of their respective owners. All rights reserved.

Advertise with us