【原創】分享一種WPF列表資料的分頁列印方案
阿新 • • 發佈:2020-12-14
核心想法:基於模板,資料與樣式分離,不希望把資料和樣式混在一起拼接。
模板,使用WPF的普通Page頁即可,樣式佈局直接使用現有的。
資料,通過DataContext繫結到頁面上。
原理很簡單,下面貼一下程式碼或截圖。
模板頁(一個很普通的WPF頁面):
簡單寫了一個列印類及相應方法。
/// <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; } } }
列印類是個泛型類,型別即是模板型別,這裡列印類及方法的設計力求做到抽象通用。
下面提供了列印方法需要的列印資料的基類。
/// <summary> /// 列印資料 /// </summary> /// <typeparam name="TItem">列表項型別</typeparam> public class PrintBaseData<TItem> where TItem : class { public string Title { get; set; } public IEnumerable<TItem> Items { get; set; } }
下面是列印功能呼叫的程式碼。
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,折騰了半天,用不好,放棄了。[裂開]