使用WPF的FlowDocument,我已经遇到了一些需要更多控制文档布局的情况,从简单的东西(页面页眉和页脚)到更复杂的(脚注,杂志样式的故事流程)甚至是更复杂的(带有关键设备的文学文本 - 我的实际要求之一)。
但是,据我所知,我唯一的选择是:
一个。使用FlowDocument并失去对布局的所有控制。
B中。使用TextFormatter从头开始编写所有内容。
A对我来说不是一个选项,B需要实现几十种方法,更重要的是,失去了FlowDocument及其相关查看器的强大功能。
我的问题是:
是否有任何替代方案可以让我利用FlowDocument的功能,它涵盖我90%的布局需求,并且只编写实现其他10%所需的代码?
编辑:FlowDocument的可重排方面对我来说至关重要。我知道我要求可回流内容和精确控制布局,这有点矛盾。但是,我知道它可以完成 - 我使用TextFormatter编写了一个简单的实现来实现我想要的东西,但我更倾向于使用FlowDocument和某种扩展来避免重新实现每个功能。
编辑2:看起来我真正追求的是FlowDocument内部分页器的一个钩子,所以我可以给它指出一个自定义类的布局。有没有办法做到这一点?答案 0 :(得分:6)
WPF中的文本系统主要用于播放用于UI的文本,而不是用于生成带有脚注和标题等的复杂文档。但是,编写了框架,以便如果要添加自定义功能,可以。
第一个问题:与文本一致的脚注和内容。 WPF提供了2个类,可以将UIElement
放入文本中:InlineUIContainer
和BlockUIContainer
。我会考虑编写自己的自定义控件,专门设计用于脚注或类似的行为,并将其放在这两个类中的一个。如果你需要更多关于什么接受的信息(链接在页面底部),我在MSDN上找到了这个方便花花公子的关系图表
alt text http://i.msdn.microsoft.com/dynimg/IC66504.png
我不完全确定你的“杂志风格故事流”是什么意思。 'FlowDocument'会自动将Block
派生类(上图中蓝色的任何内容)排列到可用空间中,您可以使用Floater
和{{1}使文本在对象周围“流动”内联元素。您还可以使用Figure
和Figure
作为页眉和页脚功能。
以下是一些示例代码:
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>
(例如,带脚注的内联按钮)
我希望有所帮助!我不知道你到底想要做什么,但我认为你仍然可以使用Button
并且只使用WPF提供的大量文本操作设备,如果你确实需要额外的功能/布局选项一个继承FlowDocument
或Block
或其他任何内容的新类,并在那里写下额外的东西,以利用所有的工作.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,那就不难了。