活动介绍

多页自定义打印及打印设置管理

发布时间: 2025-08-15 00:47:42 订阅数: 19
PDF

WPF in C# 2008: 使用.NET 3.5的下一代Windows应用开发

### 多页自定义打印及打印设置管理 #### 多页自定义打印 在进行打印操作时,如果需要打印多页内容,由于视觉元素不能跨页显示,因此需要使用 `DocumentPaginator` 类,这与打印 `FlowDocument` 时使用的类相同。不过,这里需要从头开始创建 `DocumentPaginator`,并且没有内部的私有 `DocumentPaginator` 来处理所有繁重的工作。 实现 `DocumentPaginator` 的基本设计并不复杂。需要添加一个方法将内容分割成页面,并在内部存储这些页面的信息。然后,只需响应 `GetPage()` 方法,为 `PrintDialog` 提供所需的页面即可。每个页面以 `DrawingVisual` 的形式生成,并由 `DocumentPage` 类包装。 然而,将内容分割成页面是比较棘手的部分。WPF 并没有提供神奇的解决方案,需要自己决定如何分割内容。有些内容相对容易分割,比如长表格;而有些内容则比较困难,例如打印基于文本的长文档时,需要逐字遍历所有文本,将单词添加到行,再将行添加到页面,还需要测量每个单独的文本块,以确定其是否适合该行。如果想要实现类似于 `FlowDocument` 的最佳拟合对齐方式,最好使用 `PrintDialog.PrintDocument()` 方法,因为需要编写大量代码并使用一些非常专业的算法。 下面通过一个示例来演示一个不太困难的分页任务。将 `DataTable` 的内容以表格结构打印,每条记录放在单独的一行,根据所选字体在一页上能容纳的行数将行分割到不同页面。 ```csharp public class StoreDataSetPaginator : DocumentPaginator { private DataTable dt; private Typeface typeface; private double fontSize; private double margin; private Size pageSize; public override Size PageSize { get { return pageSize; } set { pageSize = value; PaginateData(); } } public StoreDataSetPaginator(DataTable dt, Typeface typeface, double fontSize, double margin, Size pageSize) { this.dt = dt; this.typeface = typeface; this.fontSize = fontSize; this.margin = margin; this.pageSize = pageSize; PaginateData(); } private int rowsPerPage; private int pageCount; private void PaginateData() { // Create a test string for the purposes of measurement. FormattedText text = GetFormattedText("A"); // Count the lines that fit on a page. rowsPerPage = (int)((pageSize.Height - margin * 2) / text.Height); // Leave a row for the headings rowsPerPage -= 1; pageCount = (int)Math.Ceiling((double)dt.Rows.Count / rowsPerPage); } private FormattedText GetFormattedText(string text) { return GetFormattedText(text, typeface); } private FormattedText GetFormattedText(string text, Typeface typeface) { return new FormattedText( text, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, typeface, fontSize, Brushes.Black); } public override bool IsPageCountValid { get { return true; } } public override int PageCount { get { return pageCount; } } public override IDocumentPaginatorSource Source { get { return null; } } public override DocumentPage GetPage(int pageNumber) { // Create a test string for the purposes of measurement. FormattedText text = GetFormattedText("A"); double col1_X = margin; double col2_X = col1_X + text.Width * 15; // Calculate the range of rows that fits on this page. int minRow = pageNumber * rowsPerPage; int maxRow = minRow + rowsPerPage; // Create the visual for the page. DrawingVisual visual = new DrawingVisual(); // Initial, set the position to the top-left corner of the printable area. Point point = new Point(margin, margin); using (DrawingContext dc = visual.RenderOpen()) { // Draw the column headers. Typeface columnHeaderTypeface = new Typeface( typeface.FontFamily, FontStyles.Normal, FontWeights.Bold, FontStretches.Normal); point.X = ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 百万级 高质量VIP文章无限畅学
profit 千万级 优质资源任意下载
profit C知道 免费提问 ( 生成式Al产品 )

相关推荐

李_涛

知名公司架构师
拥有多年在大型科技公司的工作经验,曾在多个大厂担任技术主管和架构师一职。擅长设计和开发高效稳定的后端系统,熟练掌握多种后端开发语言和框架,包括Java、Python、Spring、Django等。精通关系型数据库和NoSQL数据库的设计和优化,能够有效地处理海量数据和复杂查询。

专栏目录

最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )

最新推荐

COZE邮件工作流搭建速成:快速实现邮件自动化处理

![COZE邮件工作流搭建速成:快速实现邮件自动化处理](https://filestage.io/wp-content/uploads/2023/10/nintex-1024x579.webp) # 1. 邮件工作流自动化基础 ## 1.1 什么是邮件工作流自动化 邮件工作流自动化是将常规的、重复性的邮件处理工作,通过自动化的工具或脚本,转换为无需人工干预的自动操作。这种自动化减少了人工劳动的需要,提高了处理邮件的效率,并且有助于减少人为错误和提高整体业务流程的精确性。 ## 1.2 自动化邮件工作流的重要性 在快速发展的IT领域中,邮件是交流和协作的重要工具。随着邮件数量的日益增多

【Coze+剪映视频制作全流程】:从导入到输出的高效秘籍

![【Coze+剪映视频制作全流程】:从导入到输出的高效秘籍](https://sp-ao.shortpixel.ai/client/to_webp,q_glossy,ret_img,w_1024,h_544/https://sethideclercq.com/wp-content/uploads/2023/10/image-32-1024x544.png) # 1. Coze+剪映视频制作软件简介 ## 简介与特色 Coze+剪映是一款集视频剪辑、特效制作和音频编辑为一体的多媒体制作软件。它以其易用性、强大的功能和丰富的视觉效果,成为了广大视频创作者的挚爱。无论是专业人士还是新手入门者,

coze智能体的用户体验设计:打造直观易用的一键生成平台

![coze智能体的用户体验设计:打造直观易用的一键生成平台](https://manualdojornalistadigital.com.br/wp-content/uploads/2024/04/como-ferramentas-de-ia-ajudam-a-escrever-textos-blog-Manual-do-Jornalista-Digital-1024x576.jpg) # 1. coze智能体的用户体验设计概述 用户体验(User Experience, UX)是衡量coze智能体成功与否的关键因素之一。coze智能体面向的是具有特定需求和习惯的用户群体,因此,从用户的角

买课博主的营销策略:社交媒体课程推广的终极指南

![买课博主的营销策略:社交媒体课程推广的终极指南](https://mlabs-wordpress-site.s3.amazonaws.com/wp-content/uploads/2024/04/social-media-design-5-1120x450.webp) # 1. 社交媒体课程营销的理论基础 在当今数字化时代,社交媒体营销已成为教育机构推广课程的重要手段。本章将探讨与社交媒体课程营销相关的基础理论,为后续章节关于市场分析、内容创建、平台运营和效果评估的深入讨论奠定理论基础。 ## 1.1 社交媒体营销的概念与重要性 社交媒体营销是运用社交网络平台来促进产品或服务的策略和实

数字信号处理:卷积算法并行计算的高效解决方案

![数字信号处理:卷积算法并行计算的高效解决方案](https://img-blog.csdnimg.cn/295803e457464ea48fd33bd306f6676a.png) # 1. 数字信号处理基础与卷积算法 数字信号处理(DSP)是现代通信和信息系统的核心技术,而卷积算法作为其基石,理解其基础对于深入研究并行计算在该领域的应用至关重要。本章将从数字信号处理的基本概念讲起,逐步深入到卷积算法的原理及其在信号处理中的关键作用。 ## 1.1 信号处理的数字化 数字化信号处理是从连续信号到数字信号的转换过程。这一转换涉及模拟信号的采样、量化和编码。数字信号处理通过使用计算机和数字硬

【统计假设检验】:MATLAB时间序列分析中的偏相关与T检验综合运用

![【统计假设检验】:MATLAB时间序列分析中的偏相关与T检验综合运用](https://jeehp.org/upload/thumbnails/jeehp-18-17f2.jpg) # 1. 统计假设检验基础与MATLAB简介 ## 1.1 统计假设检验的重要性 统计假设检验是数据分析中的核心,它允许我们在有不确定性的情况下做出决策。通过检验样本数据是否支持某一个统计假设,我们能够基于证据来推断总体参数。这对于在项目、产品或研究中进行数据驱动的决策至关重要。 ## 1.2 统计假设检验的步骤概述 进行统计假设检验时,首先需要建立原假设(H0)和备择假设(H1)。接下来,根据数据收集统计

《假如书籍会说话》的市场定位与推广策略:如何打造爆款视频

![Coze](https://help.apple.com/assets/64F8DB2842EC277C2A08D7CB/64F8DB293BFE9E2C2D0BF5F4/en_US/52f7dc9c8493a41554a74ec69cc5af32.png) # 1. 《假如书籍会说话》的市场定位分析 ## 引言 在数字化浪潮下,传统的阅读方式正逐步与现代技术相结合,带来了新的市场机遇。《假如书籍会说话》作为一款创新的数字阅读产品,其市场定位的准确性将直接影响产品的成功与否。本章将对该产品的市场定位进行深入分析。 ## 市场需求调研 首先,我们需要对目标市场进行细致的调研。通过问卷调查

【Matlab代码故障诊断】:定位并修复Matlab代码错误的高级方法

![【Matlab代码故障诊断】:定位并修复Matlab代码错误的高级方法](https://dl-preview.csdnimg.cn/85314087/0006-3d816bc4cdfbd55203436d0b5cd364e4_preview-wide.png) # 1. Matlab代码故障诊断概述 ## 1.1 故障诊断的重要性 Matlab作为一种高效的研究工具,在科研和工程设计中扮演着重要角色。随着项目复杂性的增加,代码可能出现各种故障,影响效率和结果准确性。故障诊断不仅是保证代码质量、提高开发效率的关键步骤,也是减少运行错误、优化性能的基础工作。 ## 1.2 故障诊断的工作

【个性化AI视频制作】:如何用数据驱动创造观众喜爱的视频

![【个性化AI视频制作】:如何用数据驱动创造观众喜爱的视频](https://megadigital.ai/wp-content/uploads/2023/05/Best-TikTok-Trends.jpg) # 1. 个性化AI视频制作概述 随着人工智能技术的迅猛发展,个性化AI视频制作已经成为视频内容创造领域的新趋势。本章将概述AI在视频制作中的应用及它如何推动行业变革。个性化AI视频制作能够根据用户的观看偏好、历史行为以及实时反馈,自动生成或调整视频内容。这种创新技术不仅提升了用户体验,也为视频创作者提供了新的创作视角和工具。我们还将探讨AI视频制作的优势与挑战,为读者提供一个全面的

六轴机械臂仿真与应用对接:实验室到生产线的无缝转化策略

![基于MALTAB/Simulink、Coppeliasim的六轴机械臂仿真](https://www.ru-cchi.com/help/examples/robotics/win64/ModelAndControlAManipulatorArmWithRSTAndSMExample_07.png) # 1. 六轴机械臂仿真基础 在当今高度自动化的工业生产中,六轴机械臂扮演着至关重要的角色。本章将为大家介绍六轴机械臂的基础知识,包括其结构与功能、仿真在研发中的重要性以及仿真软件的选择与应用。 ## 1.1 六轴机械臂的结构与功能 六轴机械臂是现代工业中使用极为广泛的机器人,其设计仿照人

专栏目录

最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
C知道 免费提问 ( 生成式Al产品 )