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

public class RadPaneGroupRegionAdapter : RegionAdapterBase<RadPaneGroup> { public RadPaneGroupRegionAdapter(IRegionBehaviorFactory regionBehaviorFactory) : base(regionBehaviorFactory) { } protected override void AttachBehaviors(IRegion region, RadPaneGroup regionTarget) { base.AttachBehaviors(region, regionTarget); } protected override void Adapt(IRegion region, RadPaneGroup regionTarget) { region.Views.CollectionChanged += (s, e) => { switch (e.Action) { case NotifyCollectionChangedAction.Add: foreach (var item in e.NewItems.OfType<RadPane>()) { regionTarget.Items.Add(item); } break; case NotifyCollectionChangedAction.Remove: foreach (var item in e.OldItems.OfType<RadPane>()) { //regionTarget.Items.Remove(item); item.RemoveFromParent(); } break; case NotifyCollectionChangedAction.Replace: var oldItems = e.OldItems.OfType<RadPane>(); var newItems = e.NewItems.OfType<RadPane>(); var newItemsEnumerator = newItems.GetEnumerator(); foreach (var oldItem in oldItems) { var parent = oldItem.Parent as ItemsControl; if (parent != null && parent.Items.Contains(oldItem)) { parent.Items[parent.Items.IndexOf(oldItem)] = newItemsEnumerator.Current; if (!newItemsEnumerator.MoveNext()) { break; } } else { oldItem.RemoveFromParent(); regionTarget.Items.Add(newItemsEnumerator.Current); } } break; case NotifyCollectionChangedAction.Reset: regionTarget .EnumeratePanes() .ToList() .ForEach(p => p.RemoveFromParent()); foreach (var view in region.Views) { regionTarget.Items.Add(view); } break; default: break; } }; foreach (var view in region.Views.OfType<RadPane>()) { regionTarget.Items.Add(view); } } protected override IRegion CreateRegion() { return new AllActiveRegion(); } }
public class DockingExtensions { public static bool GetRemovePanesWhenClosed(DependencyObject obj) { return (bool)obj.GetValue(RemovePanesWhenClosedProperty); } public static void SetRemovePanesWhenClosed(DependencyObject obj, bool value) { obj.SetValue(RemovePanesWhenClosedProperty, value); } public static readonly DependencyProperty RemovePanesWhenClosedProperty = DependencyProperty.RegisterAttached("RemovePanesWhenClosed", typeof(bool), typeof(DockingExtensions), new PropertyMetadata(false, OnRemovePanesWhenClosedPropertyChanged)); private static void OnRemovePanesWhenClosedPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var newValue = (bool)e.NewValue; var dock = d as RadDocking; if (dock != null) { if (newValue) { dock.PreviewClose += dock_PreviewClose; } else { dock.PreviewClose -= dock_PreviewClose; } } } private static void dock_PreviewClose(object sender, Telerik.Windows.Controls.Docking.StateChangeEventArgs e) { foreach (var pane in e.Panes) { DependencyObject o = pane.Parent; pane.RemoveFromParent(); pane.Content = null; pane.Header = null; pane.DataContext = null; } e.Handled = true; } }
Namespace OrdinaSoft.Windows.Controls;Interface Uses System.Windows, Telerik.Windows.Controls, Telerik.Windows.Controls.GridView, Telerik.Windows.Data; Type FilteringControl Nested In osRadGridViewTextColumn = Private Sealed Class ( Telerik.Windows.Controls.GridView.FilteringControl ) Public Constructor; Method Prepare (Column : GridViewColumn); Override; End;Implementation Constructor osRadGridViewTextColumn.FilteringControl; Begin Style := System.Windows.Style (Application.Current.Resources ['FilteringControlStyle']) End; Method osRadGridViewTextColumn.FilteringControl.Prepare ( Column : GridViewColumn ); Begin Inherited Prepare (Column); End;End.