This is a screenshot of a small sample. The textbox and ellipse in the upper part of the window are original WPF Controls. The lower part of the window is a bitmap of the upper part, displayed in an Image control:

The Window has the following XAML content:
<StackPanel>
<TextBlock
Margin="10"
Text="Dock of the Bay" />
<Ellipse
Margin="10"
Height="50" Width="50"
Fill="DeepSkyBlue" Stroke="MidnightBlue"
HorizontalAlignment="Left" />
<Image
x:Name="ScreenShotImage" />
</StackPanel>
The screenshot is taken, and displayed in the Image control with the following one-liner:
this.ScreenShotImage.Source = this.BitmapSource();
Here's the whole extension class:
//-----------------------------------------------------------------------// <copyright file="VisualExtensions.cs" company="DockOfTheBay">// http://www.dotbay.be// </copyright>// <summary>Defines the VisualExtensions class.</summary>//-----------------------------------------------------------------------namespace DockOfTheBay{ using System;using System.Drawing; // Need reference to System.Drawing.dll
using System.Windows;using System.Windows.Interop; // Need reference to PresentationCore.dll
using System.Windows.Media; using System.Windows.Media.Imaging;/// <summary>
/// Extension Methods for the System.Windows.Media.Visual Class
/// </summary>
public static class VisualExtensions
{/// <summary>
/// Returns the contents of a WPF Visual as a Bitmap in PNG format.
/// </summary>
/// <param name="visual">A WPF Visual.</param>
/// <returns>A GDI+ System.Drawing.Bitmap.</returns>
public static Bitmap PngBitmap(this Visual visual)
{ // Get height and widthint height = (int)(double)visual.GetValue(FrameworkElement.ActualWidthProperty);
int width = (int)(double)visual.GetValue(FrameworkElement.ActualHeightProperty);
// Render RenderTargetBitmap rtb =new RenderTargetBitmap(
height,
width,
96,
96,
PixelFormats.Default);rtb.Render(visual);
// EncodePngBitmapEncoder encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));System.IO.MemoryStream stream = new System.IO.MemoryStream();
encoder.Save(stream);
// Create BitmapBitmap bmp = new Bitmap(stream);
stream.Close();
return bmp;}
/// <summary>
/// Returns the contents of a WPF Visual as a BitmapSource, e.g.
/// for binding to an Image control.
/// </summary>
/// <param name="visual">A WPF Visual.</param>
/// <returns>A set of pixels.</returns>
public static BitmapSource BitmapSource(this Visual visual)
{ Bitmap bmp = visual.PngBitmap(); IntPtr hBitmap = bmp.GetHbitmap();BitmapSizeOptions sizeOptions = BitmapSizeOptions.FromEmptyOptions();
return Imaging.CreateBitmapSourceFromHBitmap(
hBitmap,
IntPtr.Zero, Int32Rect.Empty,sizeOptions);
}
}
}
By the way, if you prefer to screen capture to XPS instead of to a Bitmap, then I suggest this article.

No comments:
Post a Comment