2010-06-30 6 views
9

Mit FlowDocument von WPF habe ich eine Reihe von Situationen kennengelernt, in denen ich mehr Kontrolle über das Layout des Dokuments benötige, von einfachen Dingen (Seitenkopf- und -fußzeilen) bis zu komplexeren (Fußnoten, Zeitschriftenstil) Komplex (literarische Texte mit kritischem Apparat - eine meiner tatsächlichen Anforderungen).Welche Optionen habe ich für das Dokumentlayout in WPF?

aber soweit ich das beurteilen kann, ist meine einzigen Optionen sind:

A. Verwendung und Flowdocument verlieren jegliche Kontrolle über das Layout.

B. Schreiben Sie alles von Grund auf mit TextFormatter.

A ist keine Option für mich, und B erfordert Dutzende von Methoden zu implementieren, und, noch wichtiger, den Verlust der Kraft von FlowDocument und die zugehörigen Viewer.

Meine Frage ist:

Gibt es eine Alternative, die mir die Kraft von Flowdocument zu nutzen, ermöglicht es, die 90% meiner Layout Bedürfnisse abdeckt und nur den Code schreiben notwendig, die restlichen 10% zu implementieren?

EDIT: Der Reflow-Aspekt des FlowDocument ist für mich entscheidend. Ich verstehe, dass ich sowohl nach reflowbaren Inhalten als auch nach präziser Kontrolle über das Layout strebe, die etwas widersprüchlich sind. Allerdings weiß ich, dass es getan werden kann - ich schrieb eine nackte Knochenimplementierung unter Verwendung von TextFormatter, die erreicht, was ich will, aber ich würde VIEL eher FlowDocument mit irgendeiner Art Ausdehnung verwenden, um zu vermeiden, jedes Feature neu zu implementieren.

BEARBEITEN 2: Es scheint, dass, was ich wirklich bin, ist ein Haken in FlowDocument der interne Paginator, so dass ich ihm Anweisungen zum Auslegen einer benutzerdefinierten Klasse geben kann. Gibt es eine Möglichkeit, das zu tun?

Antwort

6

Das Textsystem in WPF ist in erster Linie für das Spielen mit Text zur Verwendung in UIs gedacht, nicht für die Erstellung komplexer Dokumente mit Fußnoten und Headern usw. Das Framework wurde jedoch so geschrieben, dass Sie benutzerdefinierte Funktionen hinzufügen können. Sie können.

Erstes Problem: Fußnoten und Sachen, die mit dem Text in Einklang stehen. WPF stellt 2 Klassen zur Verfügung, um UIElement s in Text einzufügen: InlineUIContainer und BlockUIContainer. Ich würde in Erwägung ziehen, ein eigenes benutzerdefiniertes Steuerelement zu schreiben, das speziell darauf ausgelegt ist, das Verhalten einer Fußnote oder etwas Ähnlichem zu haben, und es in eine dieser beiden Klassen zu setzen. Ich fand diese Handy-Dandy Beziehung Diagramm auf MSDN, wenn Sie weitere Informationen zu benötigen, was akzeptiert, was (Links am Ende der Seite sind)

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

ich nicht ganz sicher bin, was Sie unter „Magazin bedeuten Stilgeschichtenfluss ". 'FlowDocument' ordnet automatisch Block-abgeleitete Klassen (alles in Blau auf dem obigen Diagramm) in den verfügbaren Platz ein und Sie können den Text mit den Inline-Elementen Floater und Figure um Objekte herumfließen lassen. Sie können auch Figure und Floater für Ihre Kopf- und Fußzeilen verwenden. Hier

ist einige Beispiel-Code:

<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> 

Sie können die Button s mit Ihrem eigenen Kontrollen ersetzen (zB.die Inline-Taste mit dem Fußnote thang)

Dieser Code macht dies: alt text http://www.freeimagehosting.net/uploads/5d5a85e395.jpg

Ich hoffe, das hilft! Ich weiß nicht genau, was Sie zu tun versuchen, aber ich würde denken, dass Sie immer noch FlowDocument verwenden und einfach die große Menge an Textmanipulationsausrüstung verwenden können, die mit WPF bereitgestellt wird, und wenn Sie zusätzliche Funktionalität/Layoutoptionen benötigen, erstellen Sie eine neue Klasse Block oder Inline oder was auch immer und schreibe das extra Zeug hinein, um alle Vorteile der Arbeit zu nutzen, die .net für dich tun kann. Wenn Sie weitere Informationen benötigen, können Sie mehr über Text Sachen in WPF auf MSDN lesen:

Extra long article about how to use FlowDocument

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

Genießen Sie :)

+0

danken Ihnen. Das Problem ist, dass Floater die Kontrolle über das Placement nicht erlaubt und Figure darauf besteht, alles auf einer Seite zu behalten. Ich brauche eine Kombination aus beidem. – yclevine

+0

Im Magazin-Stil Flow meine ich Geschichten, die auf späteren Seiten mit anderen Inhalten dazwischen fortgesetzt werden. – yclevine

+0

hmmm Ich weiß nicht, dann könnten Sie Ihre eigene benutzerdefinierte Floater-Figur-Sache aus Inline erstellen und schreiben Sie den spezialisierten Code selbst ... Das würde bedeuten, dass Sie benutzerdefinierte Funktionalität ohne Neuschreiben des gesamten Text anzeigen System –

1

Die Antwort ist eigentlich ganz einfach: FixedDocument

Mit FixedDocument verlieren Sie die Flexibilität des FlowDocuments auf dem Bildschirm, aber Sie erhalten Unterstützung für fast alles und DocumentViewer ist ein GR iss Viewer für feste Dokumente.

Sie können auch Fixed Dokumente zu XPS speichern und sie außerhalb Ihrer App anzeigen.

This code zeigt, wie Sie ein FLowDocument nehmen und es in ein FixedDocument mit Kopfzeilen, Fußzeilen und Rand konvertieren. Ich denke, es sollte nicht allzu schwierig sein, diesen Code so anzupassen, dass er auch Fußnoten unterstützt.

+0

Vielen Dank, aber die Flexibilität von Flow Document ist für mich sehr wichtig.Ich brauche das Dokument, um reflowable zu sein, damit der Benutzer Textgröße, etc. justieren kann. – yclevine

0

Wir verwenden Apache FOP, eine Open Source XSL-FO-Implementierung, um diese Art von Dokumenten zu erstellen. Es ist tatsächlich in Java geschrieben, aber wir verwenden IKVM, um es auf .NET auszuführen. IKVM ist eine Open-Source-Implementierung von Java, die auf .NET läuft. Es funktioniert ziemlich gut. FOP produziert PDF, RTF und verschiedene andere Formate.

Der Nachteil ist, dass Sie XSL-FO lernen müssen, aber es ist nicht schwierig, wenn Sie HTML der alten Schule gewohnt sind.

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

http://www.ikvm.net/

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

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

+0

Ich muss die Dokumente nicht verursachen (einige von ihnen sind wirklich ursprünglich PDFs), aber zeigen sie eher in einer fließenden Art an. – yclevine

Verwandte Themen