Freigeben über


Capturing Frame content

Some time back I got a question about capturing the contents of a frame and it seemed easy, but every time I tried capturing the frame i was getting a blank image. The trick here is that the frame loads the content asynchronously - the simplest thing to do is wait for some time :) ...

The frame is an HwndHost that hosts an ActiveX control to load the web content. So the first thing to do is get hold of the HwndHost and then wait for a few seconds and you have it..

for (Visual v = TheFrame; v != null; v = VisualTreeHelper.GetChild(v, 0) as Visual)

{

      hwndHost = v as HwndHost;

      if (hwndHost != null)

  {

  break;

  }

}

Now create a DispatcherTimer and wait till it triggers

           DispatcherTimer timer = new DispatcherTimer();

           timer.Tick += TheFrameAfterLoaded;

            timer.Interval = TimeSpan.FromSeconds(5);

            timer.Tag = hwndHost;

            timer.Start();

  void TheFrameAfterLoaded(object sender, EventArgs e)

        {

            DispatcherTimer timer = sender as DispatcherTimer;

            HwndHost hwndHost = (HwndHost) timer.Tag;

             timer.Stop();

Image image = new Image();

            image.Source = new DrawingImage(VisualTreeHelper.GetDrawing(TheFrame));

        }

Project is attached :)

Share this post

FrameImage.zip

Comments

  • Anonymous
    March 07, 2007
    Lester, this does not work for me w/ frame ... [get empty capture].. works for me with other controls.. Running on Vista ...  

  • Anonymous
    March 25, 2007
    Did you try subscribing to the ContentRendered event instead?

  • Anonymous
    March 26, 2007
    its likely that the content is not getting rendered... you could possibly increase the time.