Kindly find the Below Code, this is the PrintExtensions Class that Prints an image of the Gridview data,
however on large amount of data, it takes maybe half an hour without doing anything and in the same time it consumes a lot of CPU memory.
but in small amount of data it works very fine.
Any solution?
This is the Build of the rad controls I am using (RadControls for WPF, v.2012.2.1001.40)
Best Regards
public
static
class
PrintExtensions
{
static
FixedDocument ToFixedDocument(FrameworkElement element, PrintDialog dialog)
{
dialog.PrintTicket.PageOrientation = PageOrientation.Landscape;
PrintCapabilities capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
Size pageSize =
new
Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
Size extentSize =
new
Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
FixedDocument fixedDocument =
new
FixedDocument();
element.Measure(
new
Size(
double
.PositiveInfinity,
double
.PositiveInfinity));
element.Arrange(
new
Rect(
new
Point(0, 0), element.DesiredSize));
for
(
double
y = 0; y < element.DesiredSize.Height; y += extentSize.Height)
{
for
(
double
x = 0; x < element.DesiredSize.Width; x += extentSize.Width)
{
VisualBrush brush =
new
VisualBrush(element);
brush.Stretch = Stretch.None;
brush.AlignmentX = AlignmentX.Left;
brush.AlignmentY = AlignmentY.Top;
brush.ViewboxUnits = BrushMappingMode.Absolute;
brush.TileMode = TileMode.None;
brush.Viewbox =
new
Rect(x, y, extentSize.Width, extentSize.Height);
PageContent pageContent =
new
PageContent();
FixedPage page =
new
FixedPage();
((IAddChild)pageContent).AddChild(page);
fixedDocument.Pages.Add(pageContent);
page.Width = pageSize.Width;
page.Height = pageSize.Height;
Canvas canvas =
new
Canvas();
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
canvas.Width = extentSize.Width;
canvas.Height = extentSize.Height;
canvas.Background = brush;
page.Children.Add(canvas);
}
}
return
fixedDocument;
}
static
GridViewDataControl ToPrintFriendlyGrid(GridViewDataControl source)
{
var grid =
new
RadGridView()
{
ItemsSource = source.ItemsSource,
RowIndicatorVisibility = Visibility.Collapsed,
ShowGroupPanel =
false
,
CanUserFreezeColumns =
false
,
IsFilteringAllowed =
false
,
EnableColumnVirtualization=
false
,
AutoExpandGroups =
true
,
AutoGenerateColumns =
false
,
Margin=
new
Thickness(10,30,10,10),
ShowColumnFooters=
true
,
EnableRowVirtualization=
true
};
double
widthsum = 0;
foreach
(var column
in
source.Columns.OfType<GridViewDataColumn>())
{
widthsum += column.Width.DisplayValue;
}
foreach
(var column
in
source.Columns.OfType<GridViewDataColumn>())
{
GridViewDataColumn newColumn =
new
GridViewDataColumn();
newColumn.Width = column.ActualWidth;
newColumn.DisplayIndex = column.DisplayIndex;
//newColumn.DataMemberBinding = new System.Windows.Data.Binding(column.UniqueName);
newColumn.DataMemberBinding = column.DataMemberBinding;
// Better to just copy the references to get all the custom formatting
newColumn.DataFormatString = column.DataFormatString;
newColumn.TextAlignment = column.TextAlignment;
newColumn.Header = column.Header;
newColumn.Footer = column.Footer;
newColumn.Width = 1030/ widthsum * column.Width.DisplayValue;
if
(column.DataType.Name ==
"Decimal"
)
{
//newColumn.TextAlignment = TextAlignment.Right;
SumFunction sum =
new
SumFunction { ResultFormatString =
"Total : {0}"
, Caption =
""
};
sum.ResultFormatString =
"{0:n}"
;
newColumn.AggregateFunctions.Add(sum);
newColumn.FooterTextAlignment = TextAlignment.Right;
}
else
{
newColumn.TextWrapping = TextWrapping.Wrap;
}
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
enum
ZoomType
{
Full,
Width,
Height,
TwoWide
};
private
static
double
constrain(
double
val,
double
val_min,
double
val_max)
{
if
(val < val_min)
return
val_min;
else
if
(val > val_max)
return
val_max;
else
return
val;
}
public
static
void
PrintPreview(
this
GridViewDataControl source,
string
title)
{
Window window =
new
Window();
window.Title =
"Print Preview"
;
if
(!
string
.IsNullOrWhiteSpace(source.ToolTip
as
string
)) window.Title +=
" of "
+ source.ToolTip;
window.Width = SystemParameters.PrimaryScreenWidth * 0.92;
window.Height = SystemParameters.WorkArea.Height;
window.Left = constrain(SystemParameters.VirtualScreenWidth - SystemParameters.PrimaryScreenWidth, 0, SystemParameters.VirtualScreenWidth - 11);
window.Top = constrain(0, 0, SystemParameters.VirtualScreenHeight - 25);
DocumentViewer viewer =
new
DocumentViewer();
viewer.Document = ToFixedDocument(ToPrintFriendlyGrid(source),
new
PrintDialog());
Zoom(viewer, ZoomType.Full);
window.Content = viewer;
window.Show();
}
public
static
void
Zoom(DocumentViewer viewer, ZoomType zoom)
{
switch
(zoom)
{
case
ZoomType.Height: viewer.FitToHeight();
break
;
case
ZoomType.Width: viewer.FitToWidth();
break
;
case
ZoomType.TwoWide: viewer.FitToMaxPagesAcross(2);
break
;
case
ZoomType.Full:
break
;
}
}
public
static
void
Print(
this
GridViewDataControl source,
bool
showDialog,
string
title)
{
var dialog =
new
PrintDialog();
var dialogResult = showDialog ? dialog.ShowDialog() :
true
;
if
(dialogResult ==
true
)
{
var viewer =
new
DocumentViewer();
Grid maingrid =
new
Grid();
ColumnDefinition gridCol1 =
new
ColumnDefinition();
maingrid.ColumnDefinitions.Add(gridCol1);
RowDefinition gridRow1 =
new
RowDefinition();
RowDefinition gridRow2 =
new
RowDefinition();
maingrid.RowDefinitions.Add(gridRow1);
maingrid.RowDefinitions.Add(gridRow2);
TextBlock txtBlock1 =
new
TextBlock();
txtBlock1.Text = title;
txtBlock1.Margin =
new
Thickness(2, 2, 2, 2);
txtBlock1.TextAlignment = TextAlignment.Center;
Grid.SetRow(txtBlock1, 0);
Grid.SetRow(ToPrintFriendlyGrid(source), 1);
maingrid.Children.Add(txtBlock1);
maingrid.Children.Add(ToPrintFriendlyGrid(source));
viewer.Document = ToFixedDocument(maingrid, dialog);
dialog.PrintDocument(viewer.Document.DocumentPaginator,
""
);
}
}
}