2010-06-30 8 views
9

Usando FlowDocument de WPF, me he encontrado con varias situaciones donde necesito más control sobre el diseño del documento, desde cosas simples (encabezados de página y pies de página) hasta más complejas (notas al pie, flujo de historias de estilo de revista) o incluso más complejo (textos literarios con aparatos críticos, uno de mis requisitos reales).¿Cuáles son mis opciones para el diseño del documento en WPF?

Sin embargo, por lo que yo puedo decir, mis únicas opciones son:

A. Uso FlowDocument y pierden todo el control sobre el diseño.

B. Escriba todo desde cero utilizando TextFormatter.

A no es una opción para mí, y B requiere implementar docenas de métodos y, lo que es más importante, la pérdida de la potencia de FlowDocument y sus Visualizadores asociados.

Mi pregunta es:

¿Hay alguna alternativa que me permita aprovechar la potencia de FlowDocument, que cubre el 90% de mis necesidades de diseño, y sólo escribir el código necesario para implementar el otro 10%?

EDITAR: El aspecto reflujo del FlowDocument es crucial para mí. Entiendo que estoy pidiendo tanto contenido reflujo como control preciso sobre el diseño, que son algo contradictorios. Sin embargo, sé que se puede hacer: escribí una implementación escueta usando TextFormatter que logra lo que quiero, pero MUCHO prefiero usar FlowDocument con algún tipo de extensión para evitar volver a implementar cada característica.

EDIT 2: Parece que lo que realmente estoy buscando es un gancho en el paginador interno de FlowDocument, de modo que pueda darle instrucciones para diseñar una clase personalizada. ¿Hay alguna forma de hacer eso?

Respuesta

6

El sistema de texto en WPF está diseñado principalmente para jugar con texto para usar en UI, no para producir documentos complejos con notas al pie y encabezados, etc. Sin embargo, el marco se ha escrito de manera que si desea agregar funcionalidad personalizada, usted puede.

Primer problema: Notas al pie y cosas que están en línea con el texto. WPF proporciona 2 clases para poner UIElement s en texto: InlineUIContainer y BlockUIContainer. Consideraría escribir su propio control personalizado que esté especialmente diseñado para tener el comportamiento de una nota al pie o algo similar y colocarlo en una de esas dos clases. He encontrado esta tabla relación práctico-excelente en MSDN si necesita más información sobre lo que acepta lo que (los enlaces están en la parte inferior de la página)

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

no estoy completamente seguro de lo que quiere decir con “la revista flujo de historia de estilo ". 'FlowDocument' organizará automáticamente Block -derivadas clases (cualquier cosa en azul en el gráfico de arriba) en el espacio disponible y puede hacer que el texto 'fluya' alrededor de objetos usando los elementos en línea Floater y Figure. También puede usar Figure y Floater para la función de encabezados y pies de página.

Aquí es un código de ejemplo:

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

puede reemplazar el Button s con sus propios controles personalizados (por ejemplo.el botón en línea con su Thang nota al pie)

Este código hace esto: alt text http://www.freeimagehosting.net/uploads/5d5a85e395.jpg

espero que ayude! No sé exactamente lo que estás tratando de hacer, pero creo que aún puedes usar FlowDocument y solo usar la gran cantidad de equipo de manipulación de texto provisto con WPF y si necesitas opciones adicionales de funcionalidad/diseño crea una nueva clase heredando Block o Inline o lo que sea y escriba las cosas adicionales para aprovechar todo el trabajo que .net puede hacer por usted. Si necesita más información, puede leer más acerca de herramientas de texto en WPF en MSDN:

Extra long article about how to use FlowDocument

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

Diviértete :)

+0

gracias. El problema es que Floater no permite el control sobre la ubicación, y Figure insiste en mantener todo en una página. Necesito una combinación de los dos. – yclevine

+0

Por flujo tipo revista quiero decir historias que continúan en páginas posteriores con otro contenido intermedio. – yclevine

+0

hmmm No sé entonces, podría crear su propia figura flotante personalizada derivada de Inline y escribir el código especializado usted mismo ... Eso significaría que obtendría una funcionalidad personalizada sin tener que reescribir todo el sistema de visualización de texto –

1

La respuesta es sencilla: FixedDocument

Ahora, con FixedDocument perderá la flexibilidad en pantalla del FlowDocument, pero obtendrá soporte para casi todo y DocumentViewer es un gr come visor para documentos fijos.

Además, puede guardar documentos fijos en XPS y verlos fuera de su aplicación.

This code muestra cómo tomar un objeto FLowDocument y convertirlo en un FixedDocument con encabezados, pies de página y margen. Creo que no debería ser demasiado difícil adaptar este código para que también soporte notas a pie de página.

+0

Gracias, pero la flexibilidad de Flow Document es vital para mí.Necesito que el documento sea reajustable para que el usuario pueda ajustar el tamaño del texto, etc. – yclevine

0

Utilizamos Apache FOP, una implementación de código abierto XSL-FO, para crear este tipo de documentos. En realidad está escrito en Java pero usamos IKVM para ejecutarlo en .NET. IKVM es una implementación de código abierto de Java que se ejecuta en .NET. Funciona muy bien. FOP produce PDF, RTF y muchos otros formatos.

El inconveniente es que necesitarás aprender XSL-FO, pero no es difícil si estás acostumbrado al HTML de la vieja escuela.

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

http://www.ikvm.net/

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

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

+0

No es necesario que cree los documentos (algunos de ellos son originalmente PDF), sino que los visualizo de forma reajustable. – yclevine

Cuestiones relacionadas