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