WPF 中的文档
Windows Presentation Foundation (WPF) 提供丰富的文档功能,可创建旨在比前几代 Windows 更易于访问和读取的高保真内容文档。 除了增强功能和质量之外,WPF 还提供用于文档显示、打包和安全性的集成服务。 本主题介绍 WPF 文档类型和文档打包。
文档类型
WPF 根据文档的预期用途将文档划分为两个广泛的类别;这些文档类别称为“固定文档”和“流文档”。
固定文档适用于需要精确“所见即所得”(WYSIWYG)显示效果的应用程序,与所用的显示器或打印机硬件无关。 固定文档的典型用途包括桌面发布、字处理和表单布局,其中坚持原始页面设计至关重要。 作为其布局的一部分,固定文档独立于所使用的显示或打印设备来对内容元素进行精确地定位安放。 例如,一个固定文档页面在 96 dpi 显示器上显示的效果与在 600 dpi 激光打印机或 4800 dpi 照相排字机上输出的效果是完全一样的。 虽然文档质量会根据每台设备的功能达到最优化,但是页面布局在所有情况下都保持不变。
相比较而言,流文档被设计用来优化查看和可读性,在以易读性为主要使用场景时,效果最佳。 流文档不是设置为一个预定义布局,而是根据运行时变量(例如窗口大小、设备分辨率和可选用户首选项)动态调整和重排其内容。 网页是流文档的简单示例,其中页面内容是动态格式化以适应当前窗口。 流文档根据运行时环境优化用户的查看和阅读体验。 例如,同一流文档将在高分辨率 19 英寸显示器或小型 2x3 英寸 PDA 屏幕上动态重新格式化,以实现最佳可读性。 此外,流文档具有许多内置功能,包括搜索、查看模式,可优化可读性,以及更改字体大小和外观的能力。 有关流文档的插图、示例和深入信息,请参阅 流文档概述。
文档控件和文本布局
.NET Framework 提供了一组预构建控件,用于简化在应用程序中使用固定文档、流文档和常规文本。 使用 DocumentViewer 控件支持显示固定文档内容。 显示流文档内容有三个不同的控件支持:FlowDocumentReader、FlowDocumentPageViewer和 FlowDocumentScrollViewer,它们映射到不同的用户方案(请参阅以下部分)。 其他 WPF 控件提供简化的布局来支持常规文本使用(请参阅下面的用户界面中的
固定文档控件 - DocumentViewer
DocumentViewer 控件旨在显示 FixedDocument 内容。 DocumentViewer 控件提供直观的用户界面,提供对常见操作的内置支持,包括打印输出、复制到剪贴板、缩放和文本搜索功能。 该控件通过熟悉的滚动机制提供对内容页面的访问。 与所有 WPF 控件一样,DocumentViewer 支持完整或部分 restyling,这样控件就可以直观地集成到几乎任何应用程序或环境中。
DocumentViewer 旨在以只读方式显示内容;编辑或修改内容不可进行,也不支持。
流文档控件
说明
有关流文档功能以及如何创建它们的详细信息,请参阅 流文档概述。
流文档内容的显示由三个控件支持:FlowDocumentReader、FlowDocumentPageViewer和 FlowDocumentScrollViewer。
FlowDocumentReader
FlowDocumentReader 包括使用户可以动态选择各种查看模式的功能,包括单页(一次页面)查看模式、一次两页(书籍阅读格式)查看模式和连续滚动(无底)查看模式。 有关这些查看模式的详细信息,请参阅 FlowDocumentReaderViewingMode。 如果不需要在不同查看模式之间动态切换的功能,FlowDocumentPageViewer 和 FlowDocumentScrollViewer 提供在特定查看模式下固定的较轻量流内容查看器。
FlowDocumentPageViewer 和 FlowDocumentScrollViewer
FlowDocumentPageViewer 在单页查看模式下显示内容,而 FlowDocumentScrollViewer 以连续滚动模式显示内容。 FlowDocumentPageViewer 和 FlowDocumentScrollViewer 都被固定在一个特定的查看模式上。 与 FlowDocumentReader相比,它包括使用户能够在各种查看模式(由 FlowDocumentReaderViewingMode 枚举提供)之间动态选择的功能,但资源消耗比 FlowDocumentPageViewer 或 FlowDocumentScrollViewer更大。
默认情况下,始终显示垂直滚动条,如果需要,水平滚动条将变为可见。 FlowDocumentScrollViewer 的默认 UI 不包含工具栏;但是,可以使用 IsToolBarVisible 属性来启用内置工具栏。
用户界面中的文本
除了向文档添加文本外,应用程序 UI(如窗体)中显然也可以使用文本。 WPF 包含多个控件,用于将文本绘制到屏幕。 每个控件都针对不同的方案,并有自己的功能和限制列表。 通常,当需要有限的文本支持时,应使用 TextBlock 元素,例如用户界面(UI)中的简短句子。 当需要最少的文本支持时,可以使用 Label。 有关详细信息,请参阅 TextBlock 概述。
文档打包
System.IO.Packaging API 提供了一种高效的方式来组织单个容器中的应用程序数据、文档内容和相关资源,该容器易于访问、可移植且易于分发。 ZIP 文件是一个能够将多个对象作为单个单元保存的 Package 类型的示例。 打包 API 提供默认的 ZipPackage 实现,该实现使用具有 XML 和 ZIP 文件体系结构的开放式打包约定标准设计。 WPF 打包 API 使创建包变得简单,并存储和访问它们中的对象。 存储在 Package 中的对象称为 PackagePart(“part”)。 包还可以包括签名的数字签名证书,这些证书可用于标识部件的发起方,并验证包的内容是否已修改。 包还包括一项 PackageRelationship 功能,该功能允许将其他信息添加到包或与特定部件关联,而无需实际修改现有部件的内容。 包服务还支持Microsoft Windows Rights Management (RM)。
WPF 包体系结构是许多关键技术的基础:
符合 XML 纸张规范 (XPS) 的 XPS 文档。
Microsoft Office“12”打开 XML 格式文档(.docx)。
用于自己的应用程序设计的自定义存储格式。
根据打包 API,XpsDocument 专为存储 WPF 固定内容文档而设计。 XpsDocument 是自包含文档,可以在查看器中打开、在 DocumentViewer 控件中显示、路由到打印后台或直接输出到与 XPS 兼容的打印机。
以下部分提供有关 WPF 提供的 Package 和 XpsDocument API 的其他信息。
包装组件
WPF 打包 API 允许将应用程序数据和文档组织成单个可移植单元。 ZIP 文件是最常见的包类型之一,是 WPF 提供的默认包类型。 Package 本身是一个抽象类,ZipPackage 使用开放标准 XML 和 ZIP 文件体系结构实现。 默认情况下,Open 方法使用 ZipPackage 来创建和使用 ZIP 文件。 包可以包含三种基本类型的项:
项 | 描述 |
---|---|
PackagePart | 应用程序内容、数据、文档和资源文件。 |
PackageDigitalSignature | [X.509 证书] 用于标识、身份验证和验证。 |
PackageRelationship | 添加了与包或特定部件相关的信息。 |
PackageParts
PackagePart(“part”)是一个抽象类,引用存储在 Package中的对象。 在 ZIP 文件中,包部件对应于存储在 ZIP 文件中的各个文件。 ZipPackagePart 为存储在 ZipPackage中的可序列化对象提供默认实现。 与文件系统一样,包中包含的部件存储在分层目录或“文件夹样式”组织中。 使用 WPF 打包 API,应用程序可以使用单个 ZIP 文件容器编写、存储和读取多个 PackagePart 对象。
PackageDigitalSignatures
为了安全,PackageDigitalSignature(“数字签名”)可以与包内的部件相关联。 PackageDigitalSignature 包含提供以下两个功能的 [509]:
标识并验证组件的源头。
确认部件未被修改。
数字签名不会阻止修改部件,但如果以任何方式更改了该部件,则针对数字签名的验证检查将失败。 然后,应用程序可以采取适当的操作,例如,阻止打开部件或通知用户部件已修改且不安全。
PackageRelationships
PackageRelationship(“关系”)提供了一种机制,用于将其他信息与包或包中的部件相关联。 关系是包级设施,它可以将其他信息与部件相关联,而无需修改实际部件内容。 在很多情况下,直接将新数据插入到部分内容中通常并不实用:
部件的实际类型及其内容架构未知。
即使已知,内容架构也可能无法提供添加新信息的方法。
部件可能经过数字签名或加密,从而排除任何修改。
包关系提供了一种可发现的方法,用于添加和关联与单个部件或整个包的其他信息。 包关系具有两种主要功能:
定义从一个部分到另一部分的依赖项关系。
定义添加注释或与部件相关的其他数据的信息关系。
PackageRelationship 提供了一种快速、可发现的方法,用于定义依赖项,并添加与包或包整体部分关联的其他信息。
依赖关系
依赖项关系用于描述一个部件对其他部件所构成的依赖项。 例如,包可能包含包含一个或多个 <img> 图像标记的 HTML 部件。 此图像标记指的是作为包的其他内部部件或外部部件(可通过 Internet 访问)定位的图像。 创建与 HTML 文件关联的 PackageRelationship 可快速轻松地发现和访问依赖资源。 浏览器或查看器应用程序可以直接访问部件关系,并立即开始组装依赖资源,而无需了解架构或分析文档。
信息关系
与注释或批注类似,PackageRelationship 还可用于存储与部件关联的其他类型的信息,而无需实际修改部件内容本身。
XPS 文档
XML 纸张规范 (XPS) 文档是一个包,其中包含一个或多个固定文档以及呈现所需的所有资源和信息。 XPS 还是 Windows Vista 的本机后台打印文件格式。 XpsDocument 存储在标准 ZIP 数据集中,可以包含 XML 和二进制组件的组合,例如图像和字体文件。 PackageRelationships 用于定义内容与完全呈现文档所需的资源之间的依赖关系。 XpsDocument 设计提供了支持多个用途的单个高保真文档解决方案:
以单个、可移植和易于分发的文件的形式读取、写入和存储固定文档内容和资源。
使用 XPS 查看器应用程序显示文档。
以 Windows Vista 的本机后台打印输出格式输出文档。
将文档直接路由到与 XPS 兼容的打印机。