HI,
I am fairly new to WPF and I am trying to print preview a grid having more than 10 columns . All the columns do not fit on a page for printing. So I would like to continue printing rest of the columns on page 2 . Or if anyother approach , so that the user can see the data for all the columns of the grid.. Here is the sample code. Please let me know.
public static void PrintPreview(Telerik.Windows.Controls.RadGridView grid)
{
if (grid != null)
{
var dialog = new PrintDialog();
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);
FixedDocument fixedDoc = (PaginateGridInToFixedDocument(ToPrintFriendlyGrid(grid, extentSize), dialog));
BusinessObjectGridPrintPreviewView previewWindow = new BusinessObjectGridPrintPreviewView();
previewWindow.RadGridView = grid;
previewWindow.Document = fixedDoc;
previewWindow.ShowDialog();
}
}
public static FixedDocument PaginateGridInToFixedDocument(GridViewDataControl 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 capabilities = dialog.PrintQueue.GetPrintCapabilities(dialog.PrintTicket);
Size pageSize = new Size(dialog.PrintableAreaWidth, dialog.PrintableAreaHeight);
Size extentSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);
var fixedDocument = new FixedDocument();
var totalHeight = 0.0;
var totalWidth = 0.0;
element.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(new Point(0, 0), element.DesiredSize));
totalHeight = element.DesiredSize.Height;
//totalWidth = element.DesiredSize.Width;
List<
double
> widthBreakList = new List<
double
>();
double widthBreakTotal = 0;
if (element.GroupDescriptors.Count > 0)
{
widthBreakTotal = widthBreakTotal + (25 * element.GroupDescriptors.Count);
}
double lastBreakLocation = 0;
widthBreakList.Add(0);
foreach (Telerik.Windows.Controls.GridViewColumn column in element.Columns)
{
if (widthBreakTotal + column.ActualWidth >= (lastBreakLocation + extentSize.Width))
{
widthBreakList.Add(widthBreakTotal);
lastBreakLocation = widthBreakTotal;
}
else
{
widthBreakTotal += column.ActualWidth;
}
}
totalWidth = widthBreakTotal;
widthBreakList.Add(totalWidth);
var yOffset = 0d;
var xOffset = 0d;
var xOffsetNext = 0d;
for (int i = 0; i < (widthBreakList.Count - 1); i++)
{
xOffset = widthBreakList[i];
xOffsetNext = widthBreakList[i + 1];
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(xOffset, yOffset, xOffsetNext, (extentSize.Height - (extentSize.Height % element.RowHeight)))
};
var
pageContent
=
new
PageContent();
var
page
=
new
FixedPage();
((IAddChild)pageContent).AddChild(page);
fixedDocument.Pages.Add(pageContent);
page.Width
=
pageSize
.Width;
page.Height
=
pageSize
.Height;
var
canvas
=
new
Canvas();
FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth);
FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight);
canvas.Width
=
xOffsetNext
- xOffset;
canvas.Height = (extentSize.Height - (extentSize.Height % element.RowHeight));
canvas.Background
=
brush
;
page.Children.Add(canvas);
yOffset += extentSize.Height - (extentSize.Height % element.RowHeight);
}
}
return fixedDocument;
}
/// <summary>
/// Convert(Re-create) RadGridView into a print-friendly format
/// </
summary
>
/// <
param
name
=
"source"
></
param
>
/// <
returns
></
returns
>
public static GridViewDataControl ToPrintFriendlyGrid(GridViewDataControl source, Size extentSize)
{
var grid = new RadGridView()
{
ItemsSource = source.ItemsSource,
RowIndicatorVisibility = Visibility.Collapsed,
ShowGroupPanel = false,
CanUserFreezeColumns = false,
IsFilteringAllowed = false,
AutoExpandGroups = true,
AutoGenerateColumns = false,
ColumnWidth = GridViewLength.SizeToHeader
};
grid.ShowColumnFooters = source.ShowColumnFooters;
grid.ShowGroupFooters = source.ShowGroupFooters;
grid.ShowColumnHeaders = source.ShowColumnHeaders;
grid.Width = source.ActualWidth;
if (source.DataContext is BusinessObjectGridViewModel)
{
GridColumnCreator columnCreator = new GridColumnCreator(source.DataContext as BusinessObjectGridViewModel, grid);
columnCreator.CreateColumns();
grid.ColumnWidth = GridViewLength.Auto;
foreach (Telerik.Windows.Controls.GridViewColumn column in grid.Columns)
{
column.Width = GridViewLength.Auto;
column.MaxWidth = extentSize.Width;
}
}
else
{
foreach (var column in source.Columns.OfType<
GridViewDataColumn
>())
{
var newColumn = new GridViewDataColumn();
newColumn.Header = column.Header;
newColumn.DataMemberBinding = new System.Windows.Data.Binding(column.UniqueName);
newColumn.Width = column.Width;
grid.Columns.Add(newColumn);
}
grid.SortDescriptors.AddRange(source.SortDescriptors);
grid.GroupDescriptors.AddRange(source.GroupDescriptors);
grid.FilterDescriptors.AddRange(source.FilterDescriptors);
}
grid.DataContext = source.DataContext;
StyleManager.SetTheme(grid, StyleManager.GetTheme(grid));
return grid;
}
<telerikNavigation:RadTabControl>
<telerikNavigation:RadTabItem Padding="4 1" DropDownContent="Slider" IsSelected="True">
<telerikNavigation:RadTabItem.Header>
<Image Source="/Dashboard;component/Resources/test.png" Margin="3" />
</telerikNavigation:RadTabItem.Header>
<telerikNavigation:RadTabItem.Content >
<Image Source="/Dashboard;component/Resources/test.png" Margin="3" />
</telerikNavigation:RadTabItem.Content>
</telerikNavigation:RadTabItem>
</telerikNavigation:RadTabControl>
crashes the application. Do you know about this issue or shall I come back with a quick test project to reproduce it?
Thanks,
Emanuel
Hello.
I've created simple style for my RadPane.
I'm setting there also DataTemplate of TitleTemplate.
I've got problem to acces programatically the element in this DataTemplate from the class on which this style is applied.
For example I'd like to acces somehow the "PART_ParentControls" element in the following simple style.
Can you please, help ?
I would really appreciate that.
Thanks a lot.
Stefan.
<Style x:Key="TelerikRadPaneStyle" TargetType="{x:Type telDockingControls:RadPane}"> |
<Setter Property="CanUserPin" Value="False" /> |
<Setter Property="CanFloat" Value="True" /> |
<Setter Property="CanUserClose" Value="False" /> |
<Setter Property="ContextMenuTemplate"> |
<Setter.Value> |
<DataTemplate> |
<telNavigationControls:RadContextMenu Visibility="Collapsed" /> |
</DataTemplate> |
</Setter.Value> |
</Setter> |
<Setter Property="TitleTemplate"> |
<Setter.Value> |
<DataTemplate > |
<Grid > |
<Grid.ColumnDefinitions> |
<ColumnDefinition Width="*" /> |
</Grid.ColumnDefinitions> |
<Grid Grid.Column="0" x:Name="PART_ParentControls" /> |
</Grid> |
</DataTemplate> |
</Setter.Value> |
</Setter> |
</Style> |