2010-06-30 51 views
9

使用WPF的FlowDocument,我遇到了很多需要更多控制文档布局的情况,从简单的事情(页面页眉和页脚)到更复杂的(脚注,杂志式故事流程),甚至更多复杂(具有关键设备的文学作品 - 我的实际需求之一)。WPF中的文档布局有哪些选项?

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

A.使用的FlowDocument和失去对布局中的所有控制权。 B.使用TextFormatter从头开始编写所有东西。

A对我来说不是一种选择,而B需要实现许多方法,更重要的是,丧失了FlowDocument及其相关查看者的权力。

我的问题是:

是否有任何替代方案,可以让我利用的FlowDocument的力量,覆盖90%的我的布局需要,只有写来实现另外10%所需的代码?

编辑:FlowDocument的可回流方面对我至关重要。我知道我要求可回流的内容和对布局的精确控制,这些都有些矛盾。然而,我知道这是可以做到的 - 我使用TextFormatter编写了一个简单的骨骼实现,它实现了我想要的功能,但我更愿意使用FlowDocument和某种扩展来避免重新实现每个功能。

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

回答

6

WPF中的文本系统主要用于在UI中使用文本,而不是用脚注和头文件等生成复杂文档。但是,框架已经编写完成,因此如果您想添加自定义功能,您可以。

第一个问题:脚注和与文本一致的东西。 WPF提供了两个类,用UIElement表示文字:InlineUIContainerBlockUIContainer。我会考虑编写自己的自定义控件,它是专门设计用来具有脚注或类似行为的行为,并将其放在这两个类中的一个中。我发现这个MSDN方便,花花公子关系图,如果你需要“杂志上什么是接受(链接在页面的底部)

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

更多信息我不能完全明白你的意思风格故事流程“。 'FlowDocument'会自动将Block派生的类(上图中的蓝色部分)排列到可用空间中,并且可以使用FloaterFigure内联元素在对象周围创建文本'流'。您还可以使用FigureFloater作为页眉和页脚功能。

下面是一些示例代码:

<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 S(例如。与你的注脚胜内嵌按钮)

这段代码是: alt text http://www.freeimagehosting.net/uploads/5d5a85e395.jpg

我希望帮助!我并不确切知道你在做什么,但我认为你仍然可以使用FlowDocument,只是使用WPF提供的大量文本操作设备,如果你确实需要额外的功能/布局选项,可以创建一个新的类继承BlockInline或其他什么,并写在那里的额外的东西,以利用所有的工作.net可以为你做。 如果您需要了解更多信息,你可以阅读更多关于在WPF文字上的东西MSDN:

Extra long article about how to use FlowDocument

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

享受自己:)

+0

谢谢。问题是Floater不允许控制放置,而图坚持把所有东西放在一个页面上。我需要两者的结合。 – yclevine 2010-07-23 08:34:59

+0

杂志风格的流程是指在后面的页面上继续其他内容的故事。 – yclevine 2010-07-23 08:42:20

+0

嗯然后我不知道,你可以创建自己的自定义浮动图形的东西,从Inline派生,并自己编写专门的代码...这将意味着你将获得自定义功能,而不必重写整个文本显示系统 – 2010-07-23 11:42:07

1

答案其实很简单:固定文档

现在,使用FixedDocument时,您将失去FlowDocument的屏幕灵活性,但您将获得对几乎所有内容的支持,并且DocumentViewer是一个gr吃固定文件的查看器。

另外,您可以将固定文档保存到XPS并在您的应用程序外查看它们。

This code显示如何获取FLowDocument并将其转换为带有页眉,页脚和页边距的FixedDocument。我认为,修改此代码以支持脚注也不是太难。

+0

谢谢,但Flow Document的灵活性对我至关重要。我需要文档可重排,以便用户可以调整文本大小等。 – yclevine 2010-07-23 08:36:42

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

+0

我不需要创建文档(其中一些实际上最初是PDF),而是以可重排的方式显示它们。 – yclevine 2010-07-23 09:03:32