<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1"> <Grid> <Grid x:Name="VisualRoot"> <Ellipse Fill="Blue" Height="300" Width="300" HorizontalAlignment="Center" VerticalAlignment="Center"/> <TextBlock Text="A Printed Visual" HorizontalAlignment="Center" VerticalAlignment="Center"/> </Grid> <Button Click="btnPrintVisual_Click" Content="Print" VerticalAlignment="Bottom"/> </Grid> </Window> //File:Window.xaml.cs using System; using System.Printing; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Xps; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void btnPrintVisual_Click(object sender, RoutedEventArgs e) { Visual visual = new Grid(); PrintDialog printDialog = new PrintDialog(); if (printDialog.ShowDialog() != true) { return; } PrintQueue pq = printDialog.PrintQueue; Visual scaledVisual = ScaleVisual(visual, pq); XpsDocumentWriter xpsdw = PrintQueue.CreateXpsDocumentWriter(pq); xpsdw.Write(scaledVisual); } private Visual ScaleVisual(Visual v, PrintQueue pq) { ContainerVisual root = new ContainerVisual(); const double inch = 96; double xMargin = 150; double yMargin = 100; PrintTicket pt = pq.UserPrintTicket; double printableWidth = pt.PageMediaSize.Width.Value; double printableHeight = pt.PageMediaSize.Height.Value; Console.WriteLine(printableWidth); Console.WriteLine(printableHeight); double xScale = 2; double yScale = 3; root.Children.Add(v); root.Transform = new MatrixTransform(xScale, 0, 0, yScale, xMargin, yMargin); return root; } } }