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, ""); } } }