随笔 - 223  文章 - 34 评论 - 159 阅读 - 32万
< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5

核心想法:基于模板,数据与样式分离,不希望把数据和样式混在一起拼接。

 

模板,使用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,折腾了半天,用不好,放弃了。[裂开]

 

posted on   Louis.Lu.Sz  阅读(637)  评论(2编辑  收藏  举报
编辑推荐:
· 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 工具,可我根本没装
点击右上角即可分享
微信分享提示