2010-06-30 28 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