【WPF.NET开发】WPF中的文档

news/2024/2/24 7:59:17/文章来源:https://blog.csdn.net/m0_51887793/article/details/135542768

本文内容

  1. 文档类型
  2. 文档控件和文本布局
  3. 文档打包
  4. XPS 文档

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

1、文档类型

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

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

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

2、文档控件和文本布局

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

2.1 固定文档控件 - DocumentViewer

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

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

2.2 流文档概述

流文档内容的显示是由以下三个控件支持的:FlowDocumentReader、FlowDocumentPageViewer 和 FlowDocumentScrollViewer。

FlowDocumentReader

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

FlowDocumentPageViewer 和 FlowDocumentScrollViewer

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

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

2.3 用户界面中的文本

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

3、文档打包

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 附带的 Package 和 XpsDocument API 的更多信息。

包组件

WPF 打包 API 允许将应用程序数据和文档组织成单个可移植单元。 ZIP 文件是最常见的包类型之一,并且是 WPF 附带的默认包类型。 Package 本身是一个抽象类,可从中使用开放式标准 XML 和 ZIP 文件体系结构来实现 ZipPackage。 Open 方法默认使用 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 还可以用于存储要与部件关联的其他类型的信息,而不必实际修改部件内容本身。

4、XPS 文档

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_925475.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Smallpdf扫描、转换、压缩、编辑、签名PDF

【应用名称】&#xff1a;Smallpdf: 扫描、转换、压缩、编辑、签名PDF 【适用平台】&#xff1a;#Android 【软件标签】&#xff1a;#Smallpdf 【应用版本】&#xff1a;1.71.0 【应用大小】&#xff1a;150MB 【软件说明】&#xff1a;通过 Smallpdf&#xff0c;您可以&…

【河海大学论文LaTeX+VSCode全指南】

河海大学论文LaTeXVSCode全指南 前言一、 LaTeX \LaTeX{} LATE​X的安装二、VScode的安装三、VScode的配置四、验证五、优化 前言 LaTeX \LaTeX{} LATE​X在论文写作方面具有传统Word无法比拟的优点&#xff0c;VScode作为一个轻量化的全功能文本编辑器&#xff0c;由于其极强的…

Python 二维平面Delaunay三角网建立

目录 一、算法概念二、代码实现三、结果示例根据二维平面内的离散点建立平面三角网。 一、算法概念 三角剖分与Delaunay剖分定义:如何把一个散点集剖分成不均匀的三角形网格,即在给定的平面点集上,生成三角形集合的过程。考虑平面点集P={p1,p2,p3,…,pn},我们希望得到三…

Kibana:使用反向地理编码绘制自定义区域地图

Elastic 地图&#xff08;Maps&#xff09;附带预定义区域&#xff0c;可让你通过指标快速可视化区域。 地图还提供了绘制你自己的区域地图的功能。 你可以使用任何您想要的区域数据&#xff0c;只要你的源数据包含相应区域的标识符即可。 但是&#xff0c;当源数据不包含区域…

前端安全专题

xss (Cross Site Scripting) 跨站脚本攻击 原理 通常指黑客通过"HTML注入"篡改了网页&#xff0c;插入了恶意的脚本&#xff0c;从而在用户浏览网页时&#xff0c;控制用户浏览器的一种攻击。 常见攻击类型 存储型XSS 攻击者将恶意的 JavaScript 脚本存储在网站…

模板设计模式-实例

在软件开发中&#xff0c;有时也会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff08;类似“请客”&#xff09;&#xff0c;其 中有些步骤是固定的&#xff08;类似“点单”和“买单”&#xff09;&#xff0c;而有些步骤并不固定&#xff0c;存在可变性&…

redis之单线程和多线程

目录 1、redis的发展史 2、redis为什么选择单线程&#xff1f; 3、主线程和Io线程是怎么协作完成请求处理的&#xff1f; 4、IO多路复用 5、开启redis多线程 1、redis的发展史 Redis4.0之前是用的单线程&#xff0c;4.0以后逐渐支持多线程 Redis4.0之前一直采用单线程的主…

【GitHub项目推荐--一行命令下载全网视频】【转载】

项目地址&#xff1a;https://github.com/soimort/you-get 首先声明&#xff0c;请不要使用该项目从事违法活动哦~仅供学习使用&#xff01; 解决痛点 如果你上网的时候看了一些东西不错&#xff0c;想下载下来&#xff0c;或者在线观看喜欢的视频&#xff0c;但是没有找到网…

Android Studio 如何设置中文

Android Studio 是一个为 Adndroid 平台开发程序的集成开发环境&#xff08;IDE&#xff09;。 如何安装中文插件 在 Jetbrains 家族的插件市场上&#xff0c;是能够搜到语言包插件的&#xff0c;正常情况下安装之后只需要重启即可享受中文界面&#xff0c;可AndroidStudio 中…

物联网介绍

阅读引言&#xff1a; 本文从多方面叙述物联网的定义以及在物联网当中的各种通信的介绍。 一、物联网的定义 1.1 通用的定义 物联网&#xff08;Internet of Things&#xff0c;IOT&#xff1b;也称为Web of Things&#xff09;是指通过各种信息传感设 备&#xff0c;如传感器、…

Vue3-TS中的接口-泛型-自定义类型

1首先一般在src下新建types文件夹&#xff0c;用来存放接口类型 2定义一个接口&#xff0c;用于限制person对象的具体属性 当需要用这个类型形成数组时&#xff0c;有2种写法 export type Persons Array<PersonInter> export type Persons PersonInter[] 3在文件中使…

【目标跟踪】跨相机如何匹配像素

文章目录 前言一、计算思路二、代码三、结果 前言 本本篇博客介绍一种非常简单粗暴的方法&#xff0c;做到跨相机像素匹配。已知各相机内外参&#xff0c;计算共视区域像素投影&#xff08;不需要计算图像特征&#xff09;。废话不多说&#xff0c;直接来&#xff0c;见下图。…

C#--核心

CSharp核心知识点学习 学习内容有&#xff1a; 绪论&#xff1a;面向对象的概念 Lesson1&#xff1a;类和对象 练习&#xff1a; Lesson2&#xff1a;封装--成员变量和访问修饰符 练习: Lesson3:封装--成员方法 Lesson4&#xff1a;封装--构造函数和析构函数 知识点四 垃圾回收…

git主分支合并到本地分支起冲突的解决办法

1.原因&#xff1a;一个项目几个人共同承担&#xff0c;难免有交叉的部分&#xff0c;这个时候交叉部分的提交就会导致冲突 2.方法&#xff1a;点开该类手动进行更改&#xff1a; 一般会有两种情况&#xff1a;一个是更改&#xff0c;一个是冲突(IDEA右上角会显示)&#xff1b;…

meter报OOM错误,如何解决?

根据在之前的压测过程碰到的问题&#xff0c;今天稍微总结总结&#xff0c;以后方便自己查找。 一、单台Mac进行压测时候&#xff0c;压测客户端Jmeter启动超过2000个线程&#xff0c;Jmeter报OOM错误&#xff0c;如何解决&#xff1f; 解答&#xff1a;单台Mac配置内存为8G&…

详解java中ArrayList

目录 前言 一、ArrayList是什么 二、ArrayList使用 1、ArrayList的构造 2 、ArrayList常见操作 3、 ArrayList的遍历 4、 ArrayList的扩容机制 三、来个练习 前言 当你看到这篇文章我觉得很好笑&#xff0c;因为我开始也不懂ArrayList现在轮到你了&#xff0c;嘻嘻嘻&am…

GRE隧道(初级VPN)配置步骤

一、拓朴图&#xff1a; 要求&#xff1a;1、PC1 和 PC2 能访问充当互联网接口地址的ISP环回口地址8.8.8.8 2、PC1 和 PC2 走GRE隧道互通 二、配置步骤&#xff1a; 1、配置IP 2、R1、R2 配置nat&#xff0c;代理内网地址通过G0/0/0口上外网 acl 2000rule permit source a…

Nginx配置负载均衡实例

Nginx配置反向代理实例二 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 负载均衡实例实现的效果 浏览器地址栏输入地址http://192.168.0.101/test/a.html&#xff0c;刷新页面进行多次请求&#xff0c;负载均衡效果&#xff0c;平均分配到8080端口服务和8…

iOS解决内存泄漏工具

在iOS应用中&#xff0c;有一些工具和技术可以帮助识别和解决内存泄漏问题。以下是一些常用的工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.Instruments&#xff1a; Instruments 是Xcode中…

分布式搜索引擎--认识

elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 。 elasticsearch结合kibana、Logstash、Beats&#xff0c;也就是elastic stack&#xff08;ELK&#xff09;。被广泛…