Mega Code Archive

 
Categories / C# / WPF
 

Print a WPF Visual

<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;         }     } }