WPF 中的文档

Windows Presentation Foundation (WPF) 提供丰富的文档功能,可创建旨在比前几代 Windows 更易于访问和读取的高保真内容文档。 除增强功能和质量外,WPF 还对文档显示、打包和安全性能提供集成服务。 本主题介绍 WPF 文档类型和文档打包。

文档类型

WPF 基于文档用途将文档分成两大类别;这些文档类别分别称为“固定文档”和“流文档”。

固定文档适用于需要精确的“所见即所得”(WYSIWYG) 呈现的应用程序,这与所使用的显示器或打印机硬件无关。 固定文档的典型用途包括桌面发布、字处理和窗体布局,在这些情况下,遵循原始页面设计非常关键。 作为其布局的一部分,固定文档独立于所使用的显示或打印设备来对内容元素进行精确地定位安放。 例如,一个固定文档页面在 96 dpi 显示器上显示的效果与在 600 dpi 激光打印机或 4800 dpi 照相排字机上输出的效果是完全一样的。 虽然文档质量会根据每台设备的功能达到最优化,但是页面布局在所有情况下都保持不变。

比较而言,流文档旨在优化查看和可读性,因此,当易读性是文档的主要使用要求时,最适合使用流文档。 流文档根据运行时变量(例如,窗口大小、设备分辨率和可选的用户首选项)来动态调整和重新排列内容,而不是设置为一个预定义的布局。 网页就是流文档的一个简单示例,网页上的页面内容会动态调整格式以适应当前窗口。 流文档会基于运行时环境来优化用户的查看和阅读体验。 例如,在高分辨率的 19 英寸显示器上或小型 2x3 英寸 PDA 屏幕上,同一流文档会动态调整格式以实现最佳可读性。 此外,流文档还具有很多内置功能,包括搜索、能够优化可读性的查看模式以及更改字体大小和外观的功能。 有关流文档的演示、示例和详细信息,请参阅流文档概述

文档控件和文本布局

.NET Framework 提供一组预生成的控件,可以简化应用程序内固定文档、流文档和常规文本的使用。 固定文档内容的显示是由 DocumentViewer 控件支持的。 流文档内容的显示是由以下三个不同的控件支持的:FlowDocumentReaderFlowDocumentPageViewerFlowDocumentScrollViewer,它们分别映射到不同的用户方案(请参阅以下部分)。 其他 WPF 控件提供简化的布局以支持常规文本的使用(请参阅下面的用户界面中的文本)。

固定文档控件 - DocumentViewer

DocumentViewer 控件旨在显示 FixedDocument 内容。 DocumentViewer 控件提供直观的用户界面,为常见操作(包括打印输出、复制到剪贴板、缩放和文本搜索功能)提供内置支持。 此控件通过常见的滚动机制提供对页面内容的访问。 像所有 WPF 控件一样,DocumentViewer 支持完整或部分样式调整,这使得控件可以在视觉效果方面几乎与任何应用程序或环境相集成。

DocumentViewer 旨在以只读模式显示内容;不支持对内容进行编辑或修改。

流文档概述

注意

有关流文档功能以及如何创建流文档的更多详细信息,请参阅流文档概述

流文档内容的显示是由以下三个控件支持的:FlowDocumentReaderFlowDocumentPageViewerFlowDocumentScrollViewer

FlowDocumentReader

FlowDocumentReader 包含使用户能够动态选择各种查看模式的功能,这些查看模式包括单页(一次一页)查看模式、一次两页(书本阅读格式)查看模式和连续滚动(无界限)查看模式。 有关这些查看模式的详细信息,请参阅 FlowDocumentReaderViewingMode。 如果不需要在不同查看模式之间动态切换的功能,则可使用 FlowDocumentPageViewerFlowDocumentScrollViewer,它们提供了固定使用特定查看模式的轻量级流内容查看器。

FlowDocumentPageViewer 和 FlowDocumentScrollViewer

FlowDocumentPageViewer 以一次一页的查看模式显示内容,而 FlowDocumentScrollViewer 以连续滚动模式显示内容。 FlowDocumentPageViewerFlowDocumentScrollViewer 都固定使用特定查看模式。 相比之下,FlowDocumentReader 包含的功能使用户能够动态选择各种查看模式(由 FlowDocumentReaderViewingMode 枚举提供),但代价是需要消耗比 FlowDocumentPageViewerFlowDocumentScrollViewer 更多的资源。

默认情况下,总是显示垂直滚动条,而水平滚动条则在需要时显示。 FlowDocumentScrollViewer 的默认 UI 不包括工具栏;不过,可使用 IsToolBarVisible 属性来启用内置工具栏。

用户界面中的文本

除可将文本添加到文档外,文本显然还可以用于应用程序 UI(如窗体)中。 WPF 包括多个用于在屏幕中绘制文本的控件。 每个控件都面向不同的方案,并具有自己的功能和限制列表。 通常,当需要支持有限的文本时应使用 TextBlock 元素,例如需要句子简短的用户界面 (UI)。 当需要最少的文本支持时,可以使用 Label。 有关详细信息,请参阅 TextBlock 概述

文档打包

System.IO.Packaging API 提供一种有效方式,用于在便于访问、可移植和易于分发的单一容器中组织应用程序数据、文档内容和相关资源。 ZIP 文件是 Package 类型的一个示例,能够将多个对象保存为一个单元。 打包 API 提供一个默认 ZipPackage 实现,此实现设计为在 XML 和 ZIP 文件体系结构中使用开放式打包约定标准。 WPF 打包 API 使得创建包以及在包内存储和访问对象变得更为简单。 存储在 Package 中的对象称为 PackagePart(“部件”)。 包还可包括已签名的数字证书,这些证书可用于标识部件的发信方以及验证包内容是否尚未修改。 包还包括 PackageRelationship 功能,该功能允许将其他信息添加到包中,或在未实际修改现有部件内容的情况下与特定部件相关联。 包服务还支持 Microsoft Windows Rights Management (RM)。

WPF 包体系结构用作大量关键技术的基础:

  • 符合 XML 纸张规范 (XPS) 的 XPS 文档。

  • Microsoft Office“12”开放式 XML 格式文档 (.docx)。

  • 用于个人应用程序设计的自定义存储格式。

XpsDocument 基于打包 API,专为存储 WPF 固定内容文档而设计。 XpsDocument 是自包含文档,可以在查看器中打开、在 DocumentViewer 控件中显示、路由到打印后台或直接输出到与 XPS 兼容的打印机。

以下部分提供有关 WPF 附带的 PackageXpsDocument API 的更多信息。

包组件

WPF 打包 API 允许将应用程序数据和文档组织成单个可移植单元。 ZIP 文件是最常见的包类型之一,并且是 WPF 附带的默认包类型。 Package 本身是一个抽象类,可从中使用开放式标准 XML 和 ZIP 文件体系结构来实现 ZipPackageOpen 方法默认使用 ZipPackage 来创建和使用 ZIP 文件。 包可以包含三种基本类型的项:

说明
PackagePart 应用程序内容、数据、文档和资源文件。
PackageDigitalSignature [X.509 证书] 用于标识、身份验证和验证。
PackageRelationship 与包或特定部件相关的补充信息。

PackageParts

PackagePart(“部件”)是一个抽象类,指存储在 Package 中的对象。 在 ZIP 文件中,包的各个部件与存储在 ZIP 文件中的各个文件相对应。 ZipPackagePart 为存储在 ZipPackage 中的可序列化对象提供默认实现。 与文件系统类似,包中包含的部件存储在分层目录或“文件夹样式”组织中。 使用 WPF 打包 API,应用程序可以使用单一 ZIP 文件容器写入、存储和读取多个 PackagePart 对象。

PackageDigitalSignatures

为安全起见,PackageDigitalSignature(“数字签名”)可以与包内的各部件关联。 PackageDigitalSignature 包含提供以下两个功能的 [509]:

  1. 标识部件的发信方并对其进行身份验证。

  2. 验证部件是否尚未被修改。

数字签名不会阻止修改部件,但如果该部件已经以任何方式发生改变,则对该数字签名的验证检查将失败。 然后应用程序可采取适当的操作(例如,阻止打开部件,或通知用户该部件已修改,是不安全的)。

PackageRelationships

PackageRelationship(“关系”)提供一种机制,用于将其他信息与包或包内的部件关联。 关系是一种包级别的设备,可以在未修改实际部件内容的情况下将其他信息与部件关联。 在许多情况下,直接向部件内容中插入新数据通常是不可行的:

  • 部件及其内容架构的实际类型未知。

  • 即使已知,内容架构可能也不会提供添加新信息的方式。

  • 部件可能已进行数字签名或加密,不能进行任何修改。

包关系提供一种可检测到的方式,用于添加其他信息并将该信息与各个部件或整个包关联。 包关系具有两种主要功能:

  1. 定义一个部件与另一个部件之间的依赖关系。

  2. 定义添加注释或与部件相关的其他数据的信息关系。

PackageRelationship 提供一种快速、可检测到的方式来定义依赖关系,并添加与包的一个部件或整个包相关联的其他信息。

依赖关系

依赖关系用于描述一个部件对其他部件的依赖性。 例如,一个包可能包含一个 HTML 部件,该部件包含一个或多个 <img> 图像标记。 此图像标记指的是作为包的其他内部部件或外部部件(可通过 Internet 访问)定位的图像。 通过创建与 HTML 文件关联的 PackageRelationship,可以快速轻松地发现和访问从属资源。 浏览器或查看器应用程序可以直接访问部件关系,并在无需了解架构或未分析文档的情况下立即开始汇编从属资源。

信息关系

与注释或批注类似,PackageRelationship 还可以用于存储要与部件关联的其他类型的信息,而不必实际修改部件内容本身。

XPS 文档

XML 纸张规范 (XPS) 文档是一个包,其中包含一个或多个固定文档以及呈现操作所需的所有资源和信息。 XPS 还是 Windows Vista 的本机后台打印文件格式。 XpsDocument 存储在标准 ZIP 数据集中,可以包含 XML 和二进制组件的组合,比如图像和字体文件。 PackageRelationships 用于定义内容和完全呈现文档所需的资源之间的依赖关系。 XpsDocument 设计提供单一的高保真文档解决方案,支持以下多种用途:

  • 将固定文档内容和资源读取、写入和存储为单个可移植且易于分发的文件。

  • 使用 XPS 查看器应用程序显示文档。

  • 以 Windows Vista 的本机后台打印输出格式输出文档。

  • 将文档直接路由到与 XPS 兼容的打印机。

另请参阅