我在WPF中的文档布局有哪些选择?

时间:2010-06-30 15:24:37

标签: .net wpf flowdocument

使用WPF的FlowDocument,我已经遇到了一些需要更多控制文档布局的情况,从简单的东西(页面页眉和页脚)到更复杂的(脚注,杂志样式的故事流程)甚至是更复杂的(带有关键设备的文学文本 - 我的实际要求之一)。

但是,据我所知,我唯一的选择是:

一个。使用FlowDocument并失去对布局的所有控制。

B中。使用TextFormatter从头开始编写所有内容。

A对我来说不是一个选项,B需要实现几十种方法,更重要的是,失去了FlowDocument及其相关查看器的强大功能。

我的问题是:

是否有任何替代方案可以让我利用FlowDocument的功能,它涵盖我90%的布局需求,并且只编写实现其他10%所需的代码?

编辑:FlowDocument的可重排方面对我来说至关重要。我知道我要求可回流内容和精确控制布局,这有点矛盾。但是,我知道它可以完成 - 我使用TextFormatter编写了一个简单的实现来实现我想要的东西,但我更倾向于使用FlowDocument和某种扩展来避免重新实现每个功能。

编辑2:看起来我真正追求的是FlowDocument内部分页器的一个钩子,所以我可以给它指出一个自定义类的布局。有没有办法做到这一点?

3 个答案:

答案 0 :(得分:6)

WPF中的文本系统主要用于播放用于UI的文本,而不是用于生成带有脚注和标题等的复杂文档。但是,编写了框架,以便如果要添加自定义功能,可以。

第一个问题:与文本一致的脚注和内容。 WPF提供了2个类,可以将UIElement放入文本中:InlineUIContainerBlockUIContainer。我会考虑编写自己的自定义控件,专门设计用于脚注或类似的行为,并将其放在这两个类中的一个。如果你需要更多关于什么接受的信息(链接在页面底部),我在MSDN上找到了这个方便花花公子的关系图表

alt text http://i.msdn.microsoft.com/dynimg/IC66504.png

我不完全确定你的“杂志风格故事流”是什么意思。 'FlowDocument'会自动将Block派生类(上图中蓝色的任何内容)排列到可用空间中,您可以使用Floater和{{1}使文本在对象周围“流动”内联元素。您还可以使用FigureFigure作为页眉和页脚功能。

以下是一些示例代码:

Floater

您可以使用自己的自定义控件替换 <FlowDocumentScrollViewer> <FlowDocument> <Paragraph> 5 green bottles standing on the wall, 5 green bottles standing on the wall, and if one green bottle was to accidentally fall, there would be 4 green bottles standing on the wall; </Paragraph> <Paragraph> 4 green bottles standing on the wall, 4 green bottles standing on the wall, <Floater HorizontalAlignment="Left" Width="250"> <BlockUIContainer> <Button>This button is in a Floater</Button> </BlockUIContainer> </Floater> and if one green bottle was to accidentally fall, there would be 3 green bottles standing on the wall; </Paragraph> <Paragraph> 3 green bottles standing on the wall, 3 green bottles standing on the wall, and if one green bottle was to accidentally fall, there would be 2 green bottles standing on the wall; </Paragraph> <Paragraph> 2 green bottles standing on the wall, 2 green bottles standing on the wall, and if one green bottle was to accidentally fall, <InlineUIContainer> <Button>This Button is inline</Button> </InlineUIContainer> there would be 1 green bottle standing on the wall... </Paragraph> </FlowDocument> </FlowDocumentScrollViewer> (例如,带脚注的内联按钮)

此代码使此: DesignerView

我希望有所帮助!我不知道你到底想要做什么,但我认为你仍然可以使用Button并且只使用WPF提供的大量文本操作设备,如果你确实需要额外的功能/布局选项一个继承FlowDocumentBlock或其他任何内容的新类,并在那里写下额外的东西,以利用所有的工作.net可以为你做。 如果您需要更多信息,可以在MSDN上阅读有关WPF中文本内容的更多信息:

Extra long article about how to use FlowDocument

The text content model used in WPF (where I got the image from)

享受自己:)

答案 1 :(得分:1)

答案实际上很简单:FixedDocument

现在,使用FixedDocument,您将失去FlowDocument的屏幕灵活性,但您将获得对所有内容的支持,而DocumentViewer是一个很好的固定文档查看器。

此外,您可以将固定文档保存到XPS并在应用程序外部查看。

This code显示如何获取FLowDocument并将其转换为具有页眉,页脚和边距的FixedDocument。我认为调整此代码以支持脚注应该不会太难。

答案 2 :(得分:0)

我们使用Apache FOP(一种开源XSL-FO实现)来创建这些类型的文档。它实际上是用Java编写的,但我们使用IKVM在.NET上运行它。 IKVM是在.NET上运行的Java的开源实现。它工作得非常好。 FOP生成PDF,RTF和其他几种格式。

缺点是你需要学习XSL-FO,但是如果你已经习惯了旧式HTML,那就不难了。

http://xmlgraphics.apache.org/fop/

http://www.ikvm.net/

http://www.ikvm.net/uses.html

http://www.w3schools.com/xslfo/default.asp