核心想法:基于模板,数据与样式分离,不希望把数据和样式混在一起拼接。
模板,使用WPF的普通Page页即可,样式布局直接使用现有的。
数据,通过DataContext绑定到页面上。
原理很简单,下面贴一下代码或截图。
模板页(一个很普通的WPF页面):
简单写了一个打印类及相应方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | /// <summary> /// 基于模板的打印 /// </summary> /// <typeparam name="T">模板页类型</typeparam> public class TemplatePrint<T> where T : Page , new () { /// <summary> /// 打印 /// </summary> /// <param name="data">数据</param> /// <param name="pageSize">分页时需要知道每页显示多少条记录</param> /// <returns></returns> public string Print<TItem>(PrintBaseData<TItem> data, int pageSize = 20) where TItem : class { try { if (data == null || data.Items == null || data.Items.Count() == 0) { return "无效数据" ; } if (pageSize <= 0) { pageSize = 20; } PrintDialog printDialog = new PrintDialog(); //计算总页数 int pageCount = ( int )Math.Ceiling(( double )data.Items.Count() / pageSize); var allData = data.Items.ToList(); for ( int i = 0; i < pageCount; i++) { data.Items = allData.Skip(i * pageSize).Take(pageSize).ToList(); var element = new T() { DataContext = data }; printDialog.PrintVisual(element, $ "信息打印" ); System.Threading.Thread.Sleep(200); } return "" ; } catch (Exception err) { return err.Message; } } } |
打印类是个泛型类,类型即是模板类型,这里打印类及方法的设计力求做到抽象通用。
下面提供了打印方法需要的打印数据的基类。
1 2 3 4 5 6 7 8 9 10 | /// <summary> /// 打印数据 /// </summary> /// <typeparam name="TItem">列表项类型</typeparam> public class PrintBaseData<TItem> where TItem : class { public string Title { get ; set ; } public IEnumerable<TItem> Items { get ; set ; } } |
下面是打印功能调用的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | var testData = new List<QueryInfo>(); var aarea = new [] { "A" , "B" , "C" , "D" , "F" }; for ( int i = 0; i < 100; i++) { testData.Add( new QueryInfo() { AreaNo = $ "{aarea[i % 4]}区" , ContainerNo = $ "{10 + i + " "}" , PositionName = $ "{101 + i + " "}" , DrugName = $ "{" 药品名 " + i}" , DrugSpec = $ "{i + 'g'}" , StorageStatus = $ "{i + 1}" }); } var printData = new PrintBaseData<QueryInfo>() { Title = "" , Items = testData }; new TemplatePrint<QueryPrintTemplate>().Print(printData, 50); |
就是这样,代码很简单,思想也简单,使用也简单。
之前研究学习了DocumentPaginator,折腾了半天,用不好,放弃了。[裂开]
分类:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2009-12-14 安装sql server 2008,提示要删除SQL Server 2005 Express 工具,可我根本没装