增强的 PrintPreviewDialog






4.94/5 (37投票s)
一个增强的 PrintPreviewDialog,具有更好的外观、本地化、自动页码和附加文本。
引言
Windows Forms 中包含的经典 PrintPreviewDialog
在实际应用程序的上下文中存在严重限制。
- 您无法自定义用户界面或添加功能。
- 唯一支持的语言是英语,并且无法本地化。因此,如果您的应用程序使用其他语言,则会出现界面不一致的情况。
- 用户无法选择打印机,也无法修改页面设置。这些任务应该在打开预览对话框之前,在其他地方完成!
- 它的工具栏和按钮采用旧式外观。换句话说,它真的很丑。
因此,我感到有必要实现自己的预览,并试图克服上述问题。
工作原理
EnhancedPrintPreviewDialog
派生自 Form
。它包含一个工具栏,并使用标准的 PrintPreviewControl
。第一项任务是重新创建预览对话框的功能,填充工具栏,并实现适当的处理程序以与预览控件进行交互。
与原始预览对话框一样,基本属性是 Document
,它属于 PrintDocument
类型。当将 PrintDocument
分配给此属性时,将为文档的 BeginPrint
、PrintPage
和 EndPrint
事件附加一些处理程序。BeginPrint
处理程序重置一个页面计数器变量,PrintPage
处理程序递增计数器,EndPrint
处理程序在界面中显示总页数。
之后,我考虑添加一个允许自动插入附加文本(包括页码)的功能。因此,引入了 AdditionalText
类以及对话框的 AdditionalTextList
属性。修改了 PrintPage
处理程序以打印附加文本。
类架构
EnhancedPrintPreviewDialog 类
您将使用主类来代替 PrintPreviewDialog
。
Document
:获取或设置与此EnhancedPrintPreviewDialog
相关的PrintDocument
。PageSetupDialog
:获取或设置一个PageSetupDialog
。如果未提供,则会创建一个默认的PageSetupDialog
对象。PrintDialog
:获取或设置一个PrintDialog
。如果未提供,则会创建一个默认的PrintDialog
对象。PrintPreviewControl
:获取PrintPreviewControl
。ShowPageSettingsButton
:获取或设置一个布尔值,指示是否在工具栏中显示页面设置按钮。ShowPrinterSettingsButton
:获取或设置一个布尔值,指示是否在工具栏中显示打印设置按钮。ShowPrinterSettingsBeforePrint
:获取或设置一个布尔值,指示在将数据发送到打印机之前是否显示打印对话框。UseAntiAlias
:获取或设置一个布尔值,指示是否应用抗锯齿。AdditionalTextList
:获取或设置要打印在内容周围的AdditionalText
对象列表。如果未提供,则会创建一个默认的空List<AdditionalText>
。
AdditionalText 类
此类包含有关要显示在内容周围的附加文本的信息。
Brush
:要使用的Brush
。Color
:要使用的Color
。如果设置此属性,则画笔将自动设置为SolidBrush
实例。Font
:要使用的Font
。OffsetX
:文本的水平偏移量。它可以是负数。OffsetY
:文本的垂直偏移量。它可以是负数。Position
:文本的位置。Text
:要打印的文本。如果字符串包含 $pagenumber 占位符,它将被替换为当前页码。
本地化
EnhancedPrintPreviewDialog
附带默认的英语语言资源和附加的意大利语语言资源。您可以按照以下步骤轻松添加您的特定语言。
在文件系统中,复制 EnhancedPrintPreviewDialog.it-IT.resx 文件,并使用您的语言和国家/地区后缀(例如:“fr-FR”)重命名它。
在 Visual Studio 的解决方案资源管理器中,单击“显示所有文件”按钮。
然后,右键单击复制的文件,然后选择“包含到项目”。
双击文件以打开资源编辑器,并编辑字符串。在 comment 列中,您将找到要翻译的英文文本。
要测试除您的默认语言以外的语言,您可以强制当前线程的区域性。
using System.Threading;
using System.Globalization;
...
public Form1() {
InitializeComponent();
Thread.CurrentThread.CurrentUICulture = new CultureInfo("it-IT");
..
}
Using the Code
在您的项目中,添加对 PrintPreview.dll 的引用。在您的代码中,导入 VR.PrintPreview
命名空间。
using VR.PrintPreview;
以与使用经典 PrintPreviewDialog
相同的方式使用 EnhancedPrintPreviewDialog
。
EnhancedPrintPreviewDialog NewPreview = new EnhancedPrintPreviewDialog();
NewPreview.Document = sample.PrintDocument;
NewPreview.ShowDialog();
使用新属性来设置附加功能。
NewPreview.AdditionalTextList.Add(new AdditionalText(
"Page - $pagenumber -" // text
, new Font("Comic sans MS", 10) // font
, Brushes.Red // brush
, TextPosition.HBottomLeft // position
, 0 // OffsetX
, 0 // OffsetY
)
);