//PayRollPrintList:要打印的 list 可换成自己要打印的类型

private List<PayRoll> _PayRollPrintList = new List<PayRoll>();

public List<PayRoll> PayRollPrintList

{

get { return _PayRollPrintList; }

set

{

if (value != null)

{

_PayRollPrintList = value;

OnPropertyChanged("PayRollPrintList");

}

}

}


//打印的方法
public void print()
{
try
{

// PayRollListModel.PayRollList 要打印的list  SalaryItemListModel.Instance.SalaryItemPrUseList 要打印的list
PrintDataPage(17, PayRollListModel.PayRollList, SalaryItemListModel.Instance.SalaryItemPrUseList);
}
catch (Exception ex)
{
MessageBox.Show("打印日志出现错误:" + ex.Message, "历史事件记录");
}
} //PageSize 为每页打印的条数
public void PrintDataPage(int PageSize, PayRollList PageData, SalaryItemList SalaryItemData)
{
int iCount = PageData.Count;
if (iCount == 0)
{
MessageBox.Show(string.Format("未查询到相应数据,无法打印!"));
return;
}
int CacheIndex = 0;//记录索引
int[] size = PageBarXPS.getPageCount(PageSize, iCount);

//要打印的页数
int iPageCount = size[0];
int iPageCount1 = iPageCount;

//最后一页的条数
int PageAmount = size[1];
FixedPage[] fixedPages = new FixedPage[iPageCount]; if (PageAmount != 0)
{
iPageCount = iPageCount - 1;
PayRollPrintList.Clear();
for (int i = iPageCount * PageSize; i < iCount; i++)
{
PayRollPrintList.Add(PageData[i]);
}
fixedPages[iPageCount] = new FixedPage();
Size fsize = new Size(96 * 11, 96 * 8.5);
fixedPages[iPageCount].Width = 96 * 11;
fixedPages[iPageCount].Height = 96 * 8.5;
fixedPages[iPageCount].Measure(fsize);
StackPanel StackPanels = ClearControls(iPageCount, iPageCount);
fixedPages[iPageCount].Children.Add(StackPanels);
}
for (int i = 0; i < iPageCount; i++)
{
PayRollPrintList.Clear();
for (; CacheIndex < PageSize * (i + 1); CacheIndex++)
{
PayRollPrintList.Add(PageData[CacheIndex]);
}
Size fsize = new Size(96 * 11, 96 * 8.5); fixedPages[i] = new FixedPage(); StackPanel StackPanels = new StackPanel();
fixedPages[i].Width = 96 * 11;
fixedPages[i].Height = 96 * 8.5;
fixedPages[i].Measure(fsize);
StackPanels = CreatePrint(iPageCount, i);
fixedPages[i].Children.Add(StackPanels); } IDocumentPaginatorSources = FileHelper.SaveXPS(fixedPages, true, iPageCount, IDocumentPaginatorSources); }
 public StackPanel CreatePrint(int count, int currentPageIndex)
{
int currentPage = currentPageIndex + 1;
Width = 60 * 16 / (SalaryItemListModel.SalaryItemPrUseList.Count(L => L.IsPrint == 1));
string xaml =
"<StackPanel x:Name='grid'" + " " +
"xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'" + " " +
"xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'" + " " +
"xmlns:mc='http://schemas.openxmlformats.org/markup-compatibility/2006'" + " " +
"xmlns:d='http://schemas.microsoft.com/expression/blend/2008'" + " " +
"xmlns:cmd='clr-namespace:Ship.Client.WPF.UI.Commands'" + " " +
"xmlns:vm='clr-namespace:Ship.Client.WPF.UI.ViewModels'" + " " +
"xmlns:be='clr-namespace:Ship.Client.WPF.Lib.Behaviors;assembly=Ship.Client.WPF.Lib'>" + " ";
xaml += "<Grid Margin='40,45,40,20'> <Grid.RowDefinitions> <RowDefinition Height='*' /> <RowDefinition Height='Auto' /> </Grid.RowDefinitions>" + " "; xaml += "<Border BorderBrush='Black' BorderThickness='1,1,0,0' >" + " ";
xaml += "<StackPanel VerticalAlignment='Center' HorizontalAlignment='Center'>" + " "; if (PayRollPrintList != null && SalaryItemListModel.Instance.SalaryItemPrUseList != null)
{
Type type = typeof(PayRoll);
for (int i = 0; i < PayRollPrintList.Count; i++)
{
int index = 0;
xaml += "<StackPanel Orientation='Horizontal' VerticalAlignment='Center' HorizontalAlignment='Center'>" + " ";
foreach (var item in SalaryItemListModel.Instance.SalaryItemPrUseList)
{
xaml += "<StackPanel Orientation='Horizontal' VerticalAlignment='Center' HorizontalAlignment='Center'>" + " ";
if (item.IsPrint == 1)
{
index++;
string pay = type.GetProperty(item.Code).GetValue(PayRollPrintList[i], null).ToString();
xaml += "<StackPanel VerticalAlignment='Center' HorizontalAlignment='Center'>" + " ";
xaml += "<Border BorderBrush='Black' BorderThickness='0,0,1,1'>" + " ";
xaml += "<TextBlock Text='" + item.Name + "' Width='" + Width + "' Height='20'/>" + " ";
xaml += "</Border>" + " ";
xaml += "<Border BorderBrush='Black' BorderThickness='0,0,1,1'>" + " ";
xaml += "<TextBlock Text='" + pay + "' Width='" + Width + "' Height='20'/>" + " ";
xaml += "</Border>" + " ";
xaml += "</StackPanel>" + " "; } xaml += "</StackPanel>" + " ";
} xaml += " </StackPanel>" + " "; }
} xaml += "</StackPanel></Border>"; xaml += "<StackPanel Margin='0,5,0,0' Height='20' Grid.Row='1' Orientation='Horizontal' VerticalAlignment='Center' HorizontalAlignment='Center'>" + " "; xaml += "<TextBlock Text='第'/>" + " ";
xaml += "<TextBlock Text='" + currentPage + "'/>" + " ";
xaml += "<TextBlock Text='页'/>" + " ";
xaml += "</StackPanel></Grid> </StackPanel> " + " ";

 var stringReader = new StringReader(xaml);
            var xmlReader = XmlReader.Create(stringReader);
            var tree = (FrameworkElement)XamlReader.Load(xmlReader);
            //tree.DataContext = this;
            StackPanels[currentPageIndex] = new StackPanel();
            StackPanels[currentPageIndex].Children.Add(tree);
            return StackPanels[currentPageIndex];

}


 public class PageBarXPS
{
/// <summary>
/// 创建FixedPage的PageBar
/// </summary>
/// <param name="iSize">总页数</param>
/// <param name="iCount">每页记录数</param>
/// <param name="curPageNo">当前页号</param>
/// <returns></returns>
public static string createPageBar(int iSize, int iCount, int curPageNo)
{
string strPageBar = string.Empty;
int Size = iSize;
int Count = iCount;
int iPageCount = 0;
int iLastPageCount = 0;
int iCurPageNo = curPageNo; if ((iCount / iSize) == 0)
{
iPageCount = 1;
}
else
{
iPageCount = iCount / iSize;
iLastPageCount = iCount - iPageCount * iSize;
if (iLastPageCount == 0)
{
iPageCount = iCount / iSize;
}
else
{
iPageCount = iCount / iSize + 1;
}
} strPageBar = "第" + iCurPageNo + "页//" + "共" + iPageCount + "页"; return strPageBar;
} /// <summary>
/// 获得页数即需要创建的fixedPage数,A[0]为页数,A[1]为最后一页记录数
/// </summary>
/// <param name="iSize"></param>
/// <param name="iCount"></param>
/// <returns></returns>
public static int[] getPageCount(int iSize, int iCount)
{
int Size = iSize;
int Count = iCount;
int iPageCount = 0;
int iLastPageCount = 0;
int[] result = new int[2];
if ((iCount / iSize) == 0)
{
iPageCount = 1;
iLastPageCount = iCount;
}
else
{
iPageCount = iCount / iSize;
iLastPageCount = iCount - iPageCount * iSize;
if (iLastPageCount == 0)
{
iPageCount = iCount / iSize;
iLastPageCount = iCount;
}
else
{
iPageCount = iCount / iSize + 1;
}
}
result[0] = iPageCount;
result[1] = iLastPageCount;
return result;
}
} public class FileHelper
{ private string GetXPSFromDialog()
{ return string.Format("d:\\temp.xps");//制造一个临时存储
} public void PrintDocument(IDocumentPaginatorSource dps)
{
LocalPrintServer printServer = new LocalPrintServer();
PrintQueue queue = printServer.DefaultPrintQueue;
PrintTicket ticket = queue.DefaultPrintTicket;
ticket.PageOrientation = PageOrientation.Landscape; XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(queue);
//PrintDocumentImageableArea area=null;
//XpsDocumentWriter writer = PrintQueue.CreateXpsDocumentWriter(ref area);
DocumentPaginator paginator = dps.DocumentPaginator;
paginator.PageSize = new Size(96*11,96*8.5);
writer.Write(paginator, ticket); } public static IDocumentPaginatorSource LoadDocumentViewer(string filename, XpsDocument _xpsDocument)
{
XpsDocument xpsPackage = _xpsDocument;
//filename = OpenXPSFileFromDialog();
XpsDocument oldXpsPackage = xpsPackage;//保存原来的XPS包
xpsPackage = new XpsDocument(filename, FileAccess.Read, CompressionOption.NotCompressed);//从文件中读取XPS文档 FixedDocumentSequence fixedDocumentSequence = xpsPackage.GetFixedDocumentSequence();//从XPS文档对象得到FixedDocumentSequence
IDocumentPaginatorSource s = fixedDocumentSequence as IDocumentPaginatorSource; if (oldXpsPackage != null)
oldXpsPackage.Close();
xpsPackage.Close();
return s;
} /// <summary>
/// 这个静态方法主要是显示选择对话框以提供文件的保存位置
/// 将传入的FixedPage对象数组(多页)写入到.xps文件
/// </summary>
/// <param name="page"></param>
/// <param name="page"></param>
/// <param name="isSaved"></param>
/// <returns></returns>
public static IDocumentPaginatorSource SaveXPS(FixedPage[] page, bool isSaved, int iPageCount, IDocumentPaginatorSource s)
{
FixedDocument fixedDoc = new FixedDocument();//创建一个文档 fixedDoc.DocumentPaginator.PageSize = new Size(96 * 11, 96 * 8.5); PageContent[] pageContent = new PageContent[iPageCount];
for (int i = 0; i < iPageCount; i++)
{
pageContent[i] = new PageContent();
Size size = new Size(96 * 11, 96 * 8.5);
pageContent[i].Measure(size);
((IAddChild)pageContent[i]).AddChild(page[i]);
fixedDoc.Pages.Add(pageContent[i]);//将对象加入到当前文档中
} FileHelper fh = new FileHelper();
string containerName = fh.GetXPSFromDialog();
if (containerName != null)
{
try
{
File.Delete(containerName);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
XpsDocument _xpsDocument = new XpsDocument(containerName, FileAccess.Write); LocalPrintServer printServer = new LocalPrintServer();
PrintQueue queue = printServer.DefaultPrintQueue;
PrintTicket ticket = queue.DefaultPrintTicket;
ticket.PageOrientation = PageOrientation.Landscape;
XpsDocumentWriter xpsdw = XpsDocument.CreateXpsDocumentWriter(_xpsDocument); xpsdw.Write(fixedDoc,ticket);//写入XPS文件
_xpsDocument.Close();
IDocumentPaginatorSource ss = LoadDocumentViewer(containerName,_xpsDocument); return ss; }
}

wpf 大控件 打印 将控件转成 xps格式 并分页打印的更多相关文章

  1. JS 实现分页打印

    在调用window.print()时,可以实现打印效果,但内容太多时要进行分页打印. 在样式中有规定几个打印的样式 page-break-before和page-break-after CSS属性并不 ...

  2. WPF 打印界面(控件)到A4纸

    这次遇到一个需求,就是将整个界面打印在A4纸上. 需求清楚后,Bing一下关于打印,就找到一个类PrintDialog ,其中两个方法可能会用到: 特别是public void PrintVisual ...

  3. WPF布局之让你的控件随着窗口等比放大缩小,适应多分辨率满屏填充应用

    一直以来,我们设计windows应用程序,都是将控件的尺寸定好,无论窗体大小怎么变,都不会改变,这样的设计对于一般的应用程序来说是没有问题的,但是对于一些比较特殊的应用,比如有背景图片的,需要铺面整个 ...

  4. WPF自定义控件与样式(9)-树控件TreeView与菜单Menu-ContextMenu

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 菜单M ...

  5. WPF:理解ContentControl——动态添加控件和查找控件

    WPF:理解ContentControl--动态添加控件和查找控件 我认为WPF的核心改变之一就是控件模型发生了重要的变化,大的方面说,现在窗口中的控件(大部分)都没有独立的Hwnd了.而且控件可以通 ...

  6. Git使用总结 Asp.net生命周期与Http协议 托管代码与非托管代码的区别 通过IEnumerable接口遍历数据 依赖注入与控制反转 C#多线程——优先级 AutoFac容器初步 C#特性详解 C#特性详解 WPF 可触摸移动的ScrollViewer控件 .NET(C#)能开发出什么样的APP?盘点那些通过Smobiler开发的移动应用

    一,原理 首先,我们要明白Git是什么,它是一个管理工具或软件,用来管理什么的呢?当然是在软件开发过程中管理软件或者文件的不同版本的工具,一些作家也可以用这个管理自己创作的文本文件,由Linus开发的 ...

  7. 【WPF学习】第二十章 内容控件

    内容控件(content control)是更特殊的控件类型,它们可包含并显示一块内容.从技术角度看,内容控件时可以包含单个嵌套元素的控件.与布局容器不同的是,内容控件只能包含一个子元素,而布局容器主 ...

  8. WPF进阶技巧和实战03-控件(3-文本控件及列表控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

  9. WPF进阶技巧和实战03-控件(4-基于范围的控件及日期控件)

    系列文章链接 WPF进阶技巧和实战01-小技巧 WPF进阶技巧和实战02-布局 WPF进阶技巧和实战03-控件(1-控件及内容控件) WPF进阶技巧和实战03-控件(2-特殊容器) WPF进阶技巧和实 ...

随机推荐

  1. 查看SQL Server数据库中各个表和视图的索引所占的空间大小

    ;with cte as ( (select t.name as TableName,i.name as IndexName, sum(row_count)as row_count, SUM (s.u ...

  2. php生成的中文文件名会变成乱码,应该这样解决

    现在php有很多类库,会生成文件,比如生成zip文件,生成二维码等等.这些类库用起来很爽,但是一旦生成带有中文的文件名,极有可能出现乱码. 问题:生成的中文文件名会变成乱码 解决:使用函数:iconv ...

  3. 14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小

    14.7.1 Resizing the InnoDB System Tablespace InnoDB 系统表空间大小 这个章节描述如何增加或者减少 InnoDB 系统表空间的大小 增加InnoDB ...

  4. 14.6.3.5 Configuring InnoDB Buffer Pool Flushing

    14.6.3.5 Configuring InnoDB Buffer Pool Flushing InnoDB 执行某些任务在后台, 包括脏叶的刷新(那些已经发生改变的pages 但是没有写入到数据文 ...

  5. 从 mian 函数开始一步一步分析 nginx 执行流程(三)

    如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 这一节我们分析ngx_start_worker_processes(),该函数代码比较少,因为它通过调 ...

  6. [LeetCode#159] Missing Ranges Strobogrammatic Number

    Problem: Given a string, find the length of the longest substring T that contains at most 2 distinct ...

  7. 【转】更新SDK后,打包APK时报 the zipalign tool was not found in the sdk

    原文网址:http://wyong.blog.51cto.com/1115465/1546632 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任 ...

  8. (经常看看)jdk 设计模式

    在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,本文列出了部分JDK中的模式应用实例,有兴趣 ...

  9. poj 3465 Corn Fields 状态压缩

    题目链接:http://poj.org/problem?id=3254 #include <cstdio> #include <cstring> #include <io ...

  10. 410. Split Array Largest Sum

    做了Zenefits的OA,比面经里的简单多了..害我担心好久 阴险的Baidu啊,完全没想到用二分,一开始感觉要用DP,类似于极小极大值的做法. 然后看了答案也写了他妈好久. 思路是再不看M的情况下 ...