WPF中使用流文档灵活地显示内容

本文介绍了WPF中流文档的概念和使用,流文档提供了一种更高级的方式来显示和格式化文本,类似HTML但功能更强大。通过XML的XAML语言定义,可以实现丰富的文本布局和格式。流文档由Block元素组成,可以包含段落、列表等,支持内嵌格式如粗体、斜体等。此外,文章还讨论了如何在WPF界面中使用FlowDocumentReader、FlowDocumentScrollViewer和FlowDocumentPageViewer控件来展示文档,并提到了RichTextBox控件用于编辑流文档。流文档可以与WYSIWYG编辑器或现有文档格式转换,支持拼写检查等功能,适用于创建复杂的文本布局。
摘要由CSDN通过智能技术生成
                          WPF中使用流文档灵活地显示内容
                            by: Markus Egger
                            form: http://msdn.microsoft.com/msdnmag/issues/07/08/wpf/default.aspx?loc=zh

 
Windows ® Presentation Foundation (WPF) 提供了一系列功能。事实上,功能是如此之多,以至于其中一些非常重要的功能都没有得到应有的关注。一个最好的例子就是“流文档”功能,它可让开发人员在 WPF 中本机创建文档。在《MSDN ® 杂志》2006 年 1 月期的“XPS 文档:创建 XML 文件规范文档所用的 API 初探”中,Bob Watson 让我们 详细了解 WPF 中的 XPS 文档,但“流文档”则不同。XPS(XML 文件规范)针对打印和面向页面的内容,而“流文档”则针对屏幕显示以及提供更动态和可以论证的更复杂模型。“流文档”几乎适用于与文本内容相关的所有方面,从产品说明到整本书籍。

文本显示无疑是更重要的 UI 功能之一。在 WPF 界面中,您通常使用标签等控件来显示文本。但是在许多情形下,您需要的不只是简单地显示几个单词。流文档提供了一种更高级的方法,而它们实质上非常简单。它们通过类似 HTML 文档的格式定义文本流,但其功能更强大,并可提供明显更先进的布局选项。

通常使用基于 XML 的标准标记语言——可扩展应用程序标记语言 (XAML) 来定义“流文档”。XAML 对于流文档特别直观,主要是因为它与 HTML 类似。以下流文档示例创建了一段文字,并只对其中几个单词应用了粗体格式:

<FlowDocument
  xmlns=’http://schemas.microsoft.com/winfx/2006/xaml/presentation’
  xmlns:x=’http://schemas.microsoft.com/winfx/2006/xaml’>
  <Paragraph>The quick <Bold>brown fox</Bold> jumps over the lazy dog.
</Paragraph>
</FlowDocument>

可以看到,与 HTML 的相似性比在其他 XAML UI 中更明显。真正的元素名称是不同的,但是至少对简单的文档来说,模式非常相似。流文档一般以包含多个块的 FlowDocument 根元素开头。“块”是指流内的元素,通常是如上例所示的文本段落(当然还有其他块类型)。段落又可以包含其他元素,例如本例中的两个粗体单词。请注意,对于任何其他 XAML 文档,根元素必须包含 XAML 特定的命名空间定义,否则无法被识别。这是 XAML 特定的实现细节,与流文档无关。请注意,命名空间定义只在独立的流文档中才需要。(流文档可以是更大的 XAML UI 的一部分,在这种情况下,该 UI 的根元素中会包含命名空间定义。)

当然,用户永远不会看到流文档的 XAML(而 HTML 源则可在浏览器中查看),这与他们无法看到任何其他 UI 元素的 XAML 一样。相反,用户看到的是文档的最终呈现。对于这个特定的示例,您可通过多种方式看到结果。或许最简单的方式是将其键入 Windows SDK 附带的实用工具 XamlPad 中(请参见图 1)。

图 1 XamlPad 中显示的极其简单的流文档
图 1  XamlPad 中显示的极其简单的流文档 (单击该图像获得较大视图)

当然,这是一个非常简单的例子,文档的定义和嵌入式布局会复杂得多。流文档支持您能想到的所有格式,例如斜体、下划线、字体颜色和字体等。图 2 显示的是一个稍微高级的示例,其结果可在图 3 中看到。

图 3 带有稍微高级格式的流文档
图 3  带有稍微高级格式的流文档 (单击该图像获得较大视图)

本示例显示的是带有内嵌格式的若干段落。它还提供另一类型块元素的第一个示例,即列表,毫无疑问,它包含多个列表项。请注意,每个列表项反过来也只是包含更多块元素的容器。因此,我不是简单地将文本置于一个列表项中,而是向每个列表项中添加一个段落元素。就此而论,我应该已向每个列表项或任何其他块类型添加了多个段落。这可以让您在列表的单个列表项内创建高级布局,这在 HTML 等格式中一般行不通,因为此类格式只会让简单的文本字符串流向每个列表元素。


流文档基础知识

至此您已了解了一些流文档的基础知识,接下来让我们回顾一下某些基础知识。如您所见,流文档是块的集合。在内部,所有块都是从 System.Windows.Documents.Block 类派生而来的 WPF 类。块又是从 ContentElement 派生而来(沿此链向上追寻几步),ContentElement 是 WPF 中专门为文档定义优化的一个相当低级别的类。此方法有些类似于您用来定义 WPF 界面的控件,它们都从 UIElement 派生而来。两者的继承树在概念上很相似,但并不完全相同。这意味着 WPF 控件和块不能直接组合。例如,一个按钮的标题不能设为一段文本,一个段落也不能直接包含一个按钮。这些控件和块之间存在一些细微差别,这是由于内容控件内的布局和块内的布局的运作方式截然不同这一事实所致。幸运的是,这两类 WPF 元素之间需要弥合的差异非常小。就按钮而言,它可以包含由带格式的文本构成的 TextBlock 对象;而块可以通过特殊 BlockUIContainer 块类包含任何 WPF 控件。这意味着,流文档可以包含所有类型的 WPF 元素(包括交互式用户界面、媒体和三维元素),而从另一个角度看,流文档也可是任何 WPF 用户界面的一部分,例如可以是控件内容的一个高级布局元素,也可以是一个真正的元素,例如销售点应用程序中的某一项的描述。

可用块的列表理论上是可扩充的,因为开发人员可以派生他们自己的块类,然后创建他们自己的针对文档呈现引擎的增强功能。这提供了我所了解的任何其他文档呈现引擎都无法提供的自由度。但是,对一般的文档创建者公开的块数量通常有限。图 4 显示了最重要的块类型的列表。

当使用 XAML 创建 WPF 流文档时,您事实上只要实例化某些类型。请看下面的 XAML 代码段(从此处起,我将省略命名空间定义,以让示例尽量简单):

<FlowDocument>
  <Paragraph>Hello World!</Paragraph>
</FlowDocument>

这会实例化一个 FlowDocument 类和 Paragraph 类(其文本设为“Hello World!”)。该段落被添加到 FlowDocument 的块集合中。请注意,对于所有 XAML 而言,元素名称都区分大小写,并且精确映射到作为 WPF 一部分而提供的类。您也可通过编程方式创建相同文档,如下所示:

FlowDocument doc = new FlowDocument();
Paragraph para = new Paragraph();
para.Inlines.Add(“Hello World!”);
doc.Blocks.Add(para);

当然,这远不及 XAML 提供的声明性方法那么直观,因此编程的方法只在特殊情形下采用。(当我需要创建一个格式丰富的报告,结果要更像一份真实的文档,而非通过许多报告引擎创建的表格形式的输出时,有时会使用此方法。)

在许多情形下,段落本身带有格式丰富的内容,这也是通过实例化类实现的,如下所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值