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.