2010-06-30 9 views
9

Utilizzo di FlowDocument di WPF, ho eseguito una serie di situazioni in cui ho bisogno di un maggiore controllo sul layout del documento, da cose semplici (intestazioni di pagina e piè di pagina) a più complesse (note a piè di pagina, flusso di storie in stile rivista) a anche più complesso (testi letterari con apparati critici - uno dei miei requisiti effettivi).Quali sono le opzioni per il layout del documento in WPF?

Tuttavia, per quanto ne so, le mie uniche opzioni sono:

A. Usa FlowDocument e perdere ogni controllo sul layout.

B. Scrivi tutto da zero utilizzando TextFormatter.

A non è un'opzione per me, e B richiede l'implementazione di dozzine di metodi e, soprattutto, la perdita della potenza di FlowDocument e dei suoi Visualizzatori associati.

La mia domanda è:

C'è qualche alternativa che mi permetterà di sfruttare la potenza di FlowDocument, che copre il 90% delle mie esigenze di layout, e solo scrivere il codice necessario per implementare il restante 10%?

MODIFICA: l'aspetto riflettente di FlowDocument è fondamentale per me. Capisco che sto chiedendo sia il contenuto riciclabile che il controllo preciso sul layout, che sono in qualche modo contraddittori. Tuttavia, so che può essere fatto - Ho scritto una semplice implementazione usando TextFormatter che realizza ciò che voglio, ma preferirei usare FlowDocument con qualche tipo di estensione per evitare di reimplementare ogni funzionalità.

MODIFICA 2: Sembra che quello che sono veramente dopo è un gancio nell'impaginatore interno di FlowDocument, in modo che possa dargli istruzioni per la disposizione di una classe personalizzata. C'è un modo per farlo?

risposta

6

Il sistema di testo in WPF è progettato principalmente per giocare con il testo da utilizzare nelle interfacce utente, non per produrre documenti complessi con note e intestazioni, ecc. Tuttavia, il framework è stato scritto in modo tale che se si desidera aggiungere funzionalità personalizzate, puoi.

Primo problema: note a piè di pagina e cose in linea con il testo. WPF fornisce 2 classi per inserire UIElement s nel testo: InlineUIContainer e BlockUIContainer. Prenderò in considerazione la possibilità di scrivere il proprio controllo personalizzato appositamente progettato per avere il comportamento di una nota a piè di pagina o qualcosa di simile e inserirlo in una di queste due classi. Ho trovato questo grafico rapporto pratico-dandy su MSDN, se avete bisogno di più informazioni su ciò che accetta ciò che (i link sono in fondo alla pagina)

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

io non sono del tutto sicuro di cosa si intende per “magazine flusso di storie di stile ". 'FlowDocument' organizzerà automaticamente le classi -edived Block (qualsiasi cosa in blu sul grafico sopra) nello spazio disponibile e puoi far scorrere il testo intorno agli oggetti usando gli elementi in linea Floater e Figure. È inoltre possibile utilizzare Figure e Floater per la funzionalità di intestazioni e piè di pagina.

Ecco qualche esempio di codice:

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

è possibile sostituire il Button s con i propri controlli personalizzati (ad es.il pulsante in linea con il vostro thang nota in calce)

Questo codice rende questo: alt text http://www.freeimagehosting.net/uploads/5d5a85e395.jpg

Mi auguro che aiuta! Non so esattamente cosa stai cercando di fare, ma penso che potresti ancora usare FlowDocument e usare solo la grande quantità di strumenti di manipolazione del testo forniti con WPF e se hai bisogno di funzionalità extra/opzioni di layout crea una nuova classe che eredita Block o Inline o qualsiasi altra cosa e scrivere le cose extra lì per sfruttare tutto il lavoro. Net può fare per voi. Se avete bisogno di ulteriori informazioni si può leggere di più su roba testo in WPF su MSDN:

Extra long article about how to use FlowDocument

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

Divertiti :)

+0

grazie. Il problema è che Floater non consente il controllo sul posizionamento e Figure insiste nel mantenere tutto in un'unica pagina. Ho bisogno di una combinazione dei due. – yclevine

+0

Per flusso stile rivista intendo storie che continuano nelle pagine successive con altri contenuti in mezzo. – yclevine

+0

hmmm Non so quindi, potresti creare la tua figura di floater personalizzata derivata da Inline e scrivere da te il codice specializzato ... Ciò significherebbe che otterresti funzionalità personalizzate senza dover riscrivere l'intero sistema di visualizzazione del testo –

1

La risposta in realtà è semplice: FixedDocument

Ora, con FixedDocument si perderà la flessibilità sullo schermo del FlowDocument ma si otterrà il supporto per quasi tutto e DocumentViewer è un gr mangiare visualizzatore per documenti fissi.

Inoltre, è possibile salvare i documenti fissi su XPS e visualizzarli all'esterno dell'app.

This code mostra come prendere un FLowDocument e convertirlo in un documento fisso con intestazioni, piè di pagina e margine. Penso che non dovrebbe essere troppo difficile adattare questo codice per supportare anche le note a piè di pagina.

+0

Grazie, ma la flessibilità del Flow Document è fondamentale per me.Ho bisogno che il documento sia ridimensionabile in modo che l'utente possa regolare le dimensioni del testo, ecc. – yclevine

0

Utilizziamo Apache FOP, un'implementazione XSL-FO open source, per creare questi tipi di documenti. In realtà è scritto in Java, ma usiamo IKVM per eseguirlo su .NET. IKVM è un'implementazione open source di Java che gira su .NET. Funziona molto bene. FOP produce PDF, RTF e molti altri formati.

Lo svantaggio è che devi imparare XSL-FO, ma non è difficile se sei abituato a HTML vecchia scuola.

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

http://www.ikvm.net/

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

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

+0

Non è necessario creare i documenti (alcuni di questi sono in realtà in origine PDF) ma piuttosto visualizzarli in modo riflettente. – yclevine

Problemi correlati