增强的 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
     )
);


