sing System.Linq;
using System.Printing;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Markup;
using System.Windows.Media;
using Telerik.Windows.Controls;
using Telerik.Windows.Controls.GridView; namespace YourNamespaceHere
{
/// <summary>
/// Support Printing Related Methods
/// </summary>
public static class PrintExtensions
{
#region ___________ Properties ____________________________________________________________________________________________
/// <summary>
/// Zoom Enumeration to specify how pages are stretched in print and preview
/// </summary>
public enum ZoomType
{
/// <summary>
/// 100% of normal size
/// </summary>
Full, /// <summary>
/// Page Width (fit so one page stretches to full width)
/// </summary>
Width, /// <summary>
/// Page Height (fit so one page stretches to full height)
/// </summary>
Height, /// <summary>
/// Display two columsn of pages
/// </summary>
TwoWide
};
#endregion
#region ___________ Methods _______________________________________________________________________________________________
/// <summary>
/// Print element to a document
/// </summary>
/// <param name="element">GUI Element to Print</param>
/// <param name="dialog">Reference to Print Dialog</param>
/// <param name="orientation">Page Orientation (i.e. Portrait vs. Landscape)</param>
/// <returns>Destination document</returns>
static FixedDocument ToFixedDocument(FrameworkElement element, PrintDialog dialog, PageOrientation orientation = PageOrientation.Portrait)
{
dialog.PrintTicket.PageOrientation = orientation;
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(, ), element.DesiredSize)); for (double y = ; y < element.DesiredSize.Height; y += extentSize.Height)
{
for (double x = ; 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;
} /// <summary>
/// Convert GridView to Printer-Friendly version of a GridView
/// </summary>
/// <param name="source">Input GridView</param>
/// <returns>Printer-Friendly version of source</returns>
static GridViewDataControl ToPrintFriendlyGrid(GridViewDataControl source)
{
RadGridView grid = new RadGridView(); grid.ItemsSource = source.ItemsSource;
grid.RowIndicatorVisibility = Visibility.Collapsed;
grid.ShowGroupPanel = false;
grid.CanUserFreezeColumns = false;
grid.IsFilteringAllowed = false;
grid.AutoExpandGroups = true;
grid.AutoGenerateColumns = false; foreach (GridViewDataColumn 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;
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;
} /// <summary>
/// Perform a Print Preview on GridView source
/// </summary>
/// <param name="source">Input GridView</param>
/// <param name="orientation">Page Orientation (i.e. Portrait vs. Landscape)</param>
/// <param name="zoom">Zoom Enumeration to specify how pages are stretched in print and preview</param>
public static void PrintPreview(GridViewDataControl source, PageOrientation orientation = PageOrientation.Landscape, ZoomType zoom = ZoomType.TwoWide)
{
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, , SystemParameters.VirtualScreenWidth - );
window.Top = constrain(, , SystemParameters.VirtualScreenHeight - ); DocumentViewer viewer = new DocumentViewer();
viewer.Document = ToFixedDocument(ToPrintFriendlyGrid(source), new PrintDialog(), orientation);
Zoom(viewer, zoom);
window.Content = viewer; window.ShowDialog();
} /// <summary>
/// Constrain val to the range [val_min, val_max]
/// </summary>
/// <param name="val">Value to be constrained</param>
/// <param name="val_min">Minimum that will be returned if val is less than val_min</param>
/// <param name="val_max">Maximum that will be returned if val is greater than val_max</param>
/// <returns>val in [val_min, val_max]</returns>
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;
} /// <summary>
/// Perform a Print on GridView source
/// </summary>
/// <param name="source">Input GridView</param>
/// <param name="showDialog">True to show print dialog before printing</param>
/// <param name="orientation">Page Orientation (i.e. Portrait vs. Landscape)</param>
/// <param name="zoom">Zoom Enumeration to specify how pages are stretched in print and preview</param>
public static void Print(GridViewDataControl source, bool showDialog = true, PageOrientation orientation = PageOrientation.Landscape, ZoomType zoom = ZoomType.TwoWide)
{
PrintDialog dialog = new PrintDialog();
bool? dialogResult = showDialog ? dialog.ShowDialog() : true; if (dialogResult == true)
{
DocumentViewer viewer = new DocumentViewer();
viewer.Document = ToFixedDocument(ToPrintFriendlyGrid(source), dialog, orientation);
Zoom(viewer, zoom);
dialog.PrintDocument(viewer.Document.DocumentPaginator, "");
}
} /// <summary>
/// Scale viewer to size specified by zoom
/// </summary>
/// <param name="viewer">Document to zoom</param>
/// <param name="zoom">Zoom Enumeration to specify how pages are stretched in print and preview</param>
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(); break;
case ZoomType.Full: break;
}
}
#endregion
}

GridView Print and Print Preview的更多相关文章

  1. 为什么 echo 3 . print(2) . print(4) . 5 . 'c'的结果是45c2131

    例子:请写出echo 3 . print(2) . print(4) . 5 . 'c'的输出结果为____? 许多人看到这个题的第一印象是输出结果不就是3245c嘛,然而正确的是答案却是45c213 ...

  2. Web window.print() 打印

    web打印 window.print() 我只给出比较有效的,方便的打印方法,有些WEB打印是调用ActiveX控件的,这样就需要用户去修改自己IE浏览器的Internet选项里的安全里的Active ...

  3. python print及格式化

    print(value,sep=' ',end='\n',file=sys.stdout, flush=False) sep=' '默认空格 print('hello','world') #hello ...

  4. echo print() print_r() var_dump()的区别

    常用调试方法 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. print()函数 ...

  5. 为什么print在python3中变成了函数?

    转自:http://www.codingpy.com/article/why-print-became-a-function-in-python-3/ 在Python 2中,print是一个语句(st ...

  6. JAVA 之print,printf,println

    print:将它的参数显示在命令窗口,并将输出光标定位在所显示的最后一个字符之后. println: 将它的参数显示在命令窗口,并在结尾加上换行符,将输出光标定位在下一行的开始. printf:是格式 ...

  7. PHP之echo/print

    1.PHP中有两个基本的输出方式:echo和print: 2.echo和print的区别: **echo:可以输出一个或多个字符串: **print:只允许输出一个字符串,返回值总为1: 3.echo ...

  8. echo(),print(),print_r(),var_dump的区别?

    常见的输出语句 echo()可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用. print()函 ...

  9. echo、print、sprint、sprintf输出

    echo() 函数 定义和用法 echo() 函数输出一个或多个字符串. 语法 echo(strings) 参数 描述 strings 必需.一个或多个要发送到输出的字符串. 提示和注释 注释:ech ...

随机推荐

  1. RSA算法 JS加密 JAVA解密

    有这样一个需求,前端登录的usernamepassword,password必需加密.但不可使用MD5,由于后台要检測password的复杂度,那么在保证安全的前提下将password传到后台呢,答案 ...

  2. nginx 配置http重定向到https

    在80端口的那个server下,添加如下: server_name www.youwebsite.com youwebsite.com; rewrite ^(.*)$ https://$host$1 ...

  3. ISO GPS定位,坐标转换以及如何显示

    这个写的公共类叫做:GPScombineClass类主要展示GPS位置的定位,GPS坐标的获取,然后从手机坐标转换成火星坐标,继而在需要的情况下,由火星转百度 ,百度转火星的详细算法:   在GPSc ...

  4. [svc]arpping链路层检测

    arping命令,测试链路层是否同 参考 yum install iputils -y arping - send ARP REQUEST to a neighbour host -b:用于发送以太网 ...

  5. ExcelConvert

    public static class ExcelConvert { #region - 由数字转换为Excel中的列字母 - public static int ToIndex(string col ...

  6. 深入理解Linux内核-进程调度

    1.什么时候进行进程切换 调度策略目标:1.进程响应尽量快:2.后台作业吞吐量尽量高:3.尽可能避免进程饥饿:4.低优先级和高优先级进程需要尽量调和. 调度策略:决定什么时候选择什么进程运行的规则.基 ...

  7. (原创)结构体自动化转为char数组的实现

    结构体自动化转换为char数组这个需求,来自于一个最近开发的一个项目,在项目开发过程中遇到一个小问题,需要将各种结构体拷贝到char数组中,这对于一个简单的结构体来说是很简单的事情,比如下面这个只有整 ...

  8. (原创)c++11改进我们的程序之垃圾回收

    c#和java中有自动垃圾回收机制,.net运行时和java虚拟机可以管理分配的堆内存,在对象失去引用时自动回收,因此在c#和jva中, 内存管理不是大问题.c++语言没有垃圾回收机制,必须自己去释放 ...

  9. XShell 技巧

    说明: 很长时间了,一直用XShell,但是总是用鼠标操作,后来想用其他方式代替鼠标,一想肯定有快捷方式等,这里就先记下一遍有用的博文,转自: http://sundful.iteye.com/blo ...

  10. Docker 入门 --- 命令总结

    Docker命令总结 前言 命令来自于官网的get-started教程,放在这里自用 part-1 ## List Docker CLI commands docker docker containe ...