hello,
PROJECT DESCRIPTION
I recently wanted to enable my GridView to perform print and print preview functions. The example a Yogesh Post about Print Preview was a great start, but it had the following limitations:
using System.Linq;
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Markup;
using System.Windows.Media;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView;
using System;
namespace Enaptive.Synergy.DeliveryPlanner
{
public static class PrintExtensions
{
static string PageTitle = "";
static FixedDocument ToFixedDocument(FrameworkElement element, PrintDialog dialog)
{
var capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
//var pageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
var extentSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
var fixedDocument = new FixedDocument();
fixedDocument.PrintTicket = dialog.PrintTicket;
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(new Point(0, 0), element.DesiredSize));
var totalHeight = element.DesiredSize.Height;
var totalWidth = element.DesiredSize.Width;
//var yOffset = 0d;
//while (yOffset < totalHeight)
//{
// var brush = new VisualBrush(element)
// {
// Stretch = Stretch.None,
// AlignmentX = AlignmentX.Left,
// AlignmentY = AlignmentY.Top,
// ViewboxUnits = BrushMappingMode.Absolute,
// TileMode = TileMode.None,
// Viewbox = new Rect(0, yOffset, extentSize.Width, extentSize.Height)
// };
// var pageContent = new PageContent();
// var page = new FixedPage();
// ((IAddChild)pageContent).AddChild(page);
// fixedDocument.Pages.Add(pageContent);
// page.Width = pageSize.Width;
// page.Height = pageSize.Height;
// // add a title to the page
// double top = capabilities.PageImageableArea.OriginHeight;
// TextBlock pageText = new TextBlock();
// pageText.Text = PageTitle;
// pageText.FontSize = 24;
// pageText.Margin = new Thickness(5);
// FixedPage.SetLeft(pageText, top);
// pageText.Width = extentSize.Width;
// page.Children.Add(pageText);
// top += 18;
// TextBlock dateText = new TextBlock();
// dateText.Text = "As of " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");
// dateText.FontStyle = FontStyles.Italic;
// dateText.FontSize = 10;
// dateText.Margin = new Thickness(5);
// FixedPage.SetLeft(dateText, capabilities.PageImageableArea.OriginWidth);
// FixedPage.SetTop(dateText, top);
// dateText.Width = extentSize.Width;
// page.Children.Add(dateText);
// top += 24;
// var canvas = new Canvas();
// FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
// FixedPage.SetTop(canvas, top);
// canvas.Width = extentSize.Width;
// canvas.Height = extentSize.Height-top;
// canvas.Background = brush;
// page.Children.Add(canvas);
// yOffset += extentSize.Height;
//}
var yOffset = 0d;
var xOffset = 0d;
//double tmpHeight = 0;
int j = 0, k = 0, i;
while (yOffset < totalHeight)
{
double tmpHeight = 0;
while (xOffset < totalWidth)
{
//for Width
double tmpWidth = 0;
var tmpElementWidth = (GridViewDataControl)element;
for (i = j; i < tmpElementWidth.Columns.Count; i++)
{
tmpWidth += tmpElementWidth.Columns[i].ActualWidth;
if (tmpWidth > extentSize.Width)
{
tmpWidth = extentSize.Width - (tmpWidth - tmpElementWidth.Columns[i].ActualWidth);
j = i - 1;
break;
}
}
if ((i < tmpElementWidth.Columns.Count) == false)
{
tmpWidth = 0;
j = 0;
}
//
//for Height
//var tmpElementHeight = (GridViewDataControl)element;
//for (i = k; i < tmpElementHeight.Items.Count; i++)
//{
// tmpHeight += tmpElementHeight.RowHeight;
// if (tmpHeight >= extentSize.Height)
// {
// tmpHeight = extentSize.Height - (tmpHeight - tmpElementHeight.RowHeight);
// k = i - 1;
// break;
// }
//}
//if ((i < tmpElementWidth.Columns.Count) == false)
//{
// tmpHeight = 0;
// k = 0;
//}
//
var brush = new VisualBrush(element)
{
Stretch = Stretch.None,
AlignmentX = AlignmentX.Left,
AlignmentY = AlignmentY.Top,
ViewboxUnits = BrushMappingMode.Absolute,
TileMode = TileMode.None,
Viewbox = new Rect(xOffset, yOffset, extentSize.Width - tmpWidth, extentSize.Height - tmpHeight)
};
var pageContent = new PageContent();
var page = new FixedPage();
page.PrintTicket = dialog.PrintTicket;
((IAddChild)pageContent).AddChild(page);
fixedDocument.Pages.Add(pageContent);
page.Width = extentSize.Width;
page.Height = extentSize.Height;
// add a title to the page
double top = capabilities.PageImageableArea.OriginHeight;
TextBlock pageText = new TextBlock();
pageText.Text = PageTitle;
pageText.FontSize = 24;
pageText.Margin = new Thickness(5);
FixedPage.SetLeft(pageText, top);
pageText.Width = extentSize.Width;
page.Children.Add(pageText);
top += 30;
TextBlock dateText = new TextBlock();
dateText.Text = "As of " + DateTime.Now.ToString("yyyy-MM-dd HH:mm");
dateText.FontStyle = FontStyles.Italic;
dateText.FontSize = 10;
dateText.Margin = new Thickness(5);
FixedPage.SetLeft(dateText, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(dateText, top);
dateText.Width = extentSize.Width;
page.Children.Add(dateText);
top += 24;
var canvas = new Canvas();
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, top);
canvas.Width = extentSize.Width - tmpWidth;
canvas.Height = extentSize.Height - top - tmpHeight;
canvas.Background = brush;
page.Children.Add(canvas);
xOffset += extentSize.Width - tmpWidth;
tmpHeight = 0;
}
xOffset = 0d;
yOffset += extentSize.Height - tmpHeight;
}
return fixedDocument;
}
static GridViewDataControl ToPrintFriendlyGrid(GridViewDataControl source)
{
var grid = new RadGridView()
{
ItemsSource = source.ItemsSource,
RowIndicatorVisibility = Visibility.Collapsed,
ShowGroupPanel = false,
CanUserFreezeColumns = false,
IsFilteringAllowed = false,
AutoExpandGroups = true,
AutoGenerateColumns = false,
};
foreach (var column in source.Columns.OfType<GridViewDataColumn>())
{
string HideRedToggleButtonColumn = column.Header.ToString();
if (HideRedToggleButtonColumn != "Telerik.Windows.Controls.RadToggleButton Content: IsChecked:False" && HideRedToggleButtonColumn != "Telerik.Windows.Controls.RadToggleButton Content: IsChecked:True")
{
//MessageBox.Show(column.UniqueName);
var newColumn = new GridViewDataColumn();
newColumn.DataMemberBinding = new System.Windows.Data.Binding(column.UniqueName);
//newColumn.Width.IsSizeToCells = column.Width.IsSizeToCells;
//newColumn.DisplayIndex = column.DisplayIndex;
//newColumn.DataType = typeof(string);
newColumn.Header = column.Header;
newColumn.Width = column.ActualWidth;
//newColumn.DisplayIndex = column.DisplayIndex;
newColumn.DataMemberBinding = column.DataMemberBinding; // Better to just copy the references to get all the custom formatting
newColumn.DataFormatString = column.DataFormatString;
grid.Columns.Add(newColumn);
}
}
//foreach (GridViewDataColumn colms in source.Items.OfType<GridViewDataColumn>())
//{
// var newColumn = new GridViewDataColumn();
// newColumn.DataMemberBinding = new System.Windows.Data.Binding(colms.UniqueName);
// grid.Columns.Add(newColumn);
//}
//for (int i = 0; i < source.Columns.Count; i++)
//{
// var newColumn = new GridViewDataColumn();
// newColumn.DataMemberBinding = new System.Windows.Data.Binding(source.Columns[i].UniqueName);
// grid.Columns.Add(newColumn);
//}
//********************
StyleManager.SetTheme(grid, StyleManager.GetTheme(grid));
grid.SortDescriptors.AddRange(source.SortDescriptors);
grid.GroupDescriptors.AddRange(source.GroupDescriptors);
grid.FilterDescriptors.AddRange(source.FilterDescriptors);
return grid;
}
public static void PrintPreview(this GridViewDataControl source, string pageTitle)
{
PageTitle = pageTitle;
var dialog = new PrintDialog();
dialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
dialog.PrintTicket = dialog.PrintQueue.DefaultPrintTicket;
//for Landscape
dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
var window = new Window()
{
Title = "Print Preview - " + pageTitle,
Content = new DocumentViewer()
{
Document = ToFixedDocument(ToPrintFriendlyGrid(source), dialog)
}
};
window.ShowDialog();
}
public static void Print(this GridViewDataControl source, bool showDialog, string pageTitle)
{
PageTitle = pageTitle;
var dialog = new PrintDialog();
dialog.PrintQueue = LocalPrintServer.GetDefaultPrintQueue();
dialog.PrintTicket = dialog.PrintQueue.DefaultPrintTicket;
//for Landscape
dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
var dialogResult = showDialog ? dialog.ShowDialog() : true;
if (dialogResult == true)
{
var viewer = new DocumentViewer();
viewer.Document = ToFixedDocument(ToPrintFriendlyGrid(source), dialog);
dialog.PrintDocument(viewer.Document.DocumentPaginator, "");
}
}
}
}
regards
Yogesh