Pregunta

Esta es la situación.

Estoy encargado de auto-generar un documento bastante grande que consiste en una serie de secciones distintas de altura variable y constante (de página completa) de ancho.

Cada sección se compone de dos sub-secciones distintas. Pensar en ellos como "cabecera" y "datos".

El problema, entonces, es: Cuando sólo una sección cabe en una página (ya que tiene una gran cantidad de datos) de la cabecera debe mostrar en la parte superior y los datos debe mostrar en la parte inferior, dejando espacio no utilizado en el centro.

Cuando más de una sección cabe en una página todo debería "aplastar a la cima", sin dejar espacio entre las sub-secciones, o incluso las secciones. Todo el espacio en blanco adicional debe estar en el fondo.

¿Qué tipo de construcciones puedo utilizar para lograr esto?

Tal vez esta es una tarea más adecuado para un FixedDocument? Tengo un libro bastante grande en WPF, pero sólo apenas menciona FixedDocuments.

¿Fue útil?

Solución

No estoy seguro si usted todavía está luchando con este problema, pero se podría tratar de usar FlowDocument.

Si se escribe una envoltura alrededor de DocumentPaginator usted será capaz de añadir una cabecera en la flowdoc. Además, se puede establecer el flowdoc.PagePadding a un valor personalizado, teniendo en cuenta la printablePageHeight y la altura de su contenido tamaño.

Este es un ejemplo de una envoltura alrededor de la DocumentPaginator que me dieron del libro: Pro WPF en C # 2008 - Mathew MacDonald

Espero que ayuda. (PD. Yo sólo copiar y pegar el valor por defecto por lo que no añadió ninguna costumbre calculadoras, etc.)

using System.Globalization;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Media;

namespace NPS.ClinicalEAudit.Controls
{

    public class FlowDocPaginator : DocumentPaginator
    {
        private DocumentPaginator _paginator;

        public FlowDocPaginator(FlowDocument flowDoc)
        {
            _paginator = ((IDocumentPaginatorSource) flowDoc).DocumentPaginator;

        }

        public override bool IsPageCountValid
        {
            get { return _paginator.IsPageCountValid; }
        }

        public override int PageCount
        {
            get { return _paginator.PageCount; }
        }

        public override Size PageSize
        {
            get { return _paginator.PageSize; }
            set { _paginator.PageSize = value; }
        }

        public override IDocumentPaginatorSource Source
        {
            get { return _paginator.Source; }
        }

        public override DocumentPage GetPage(int pageNumber)
        {
            // Get the requested page.
            DocumentPage page = _paginator.GetPage(pageNumber);

            // Wrap the page in a Visual object. You can then apply transformations
            // and add other elements.
            ContainerVisual newVisual = new ContainerVisual();
            newVisual.Children.Add(page.Visual);

            // Create a header.
            DrawingVisual header = new DrawingVisual();

            using (DrawingContext dc = header.RenderOpen())
            {
                Typeface typeface = new Typeface("Times New Roman");
                FormattedText text = new FormattedText("Page " +
                                                       (pageNumber + 1).ToString(), CultureInfo.CurrentCulture,
                                                       FlowDirection.LeftToRight, typeface, 14, Brushes.Black);

                // Leave a quarter inch of space between the page edge and this text.
                dc.DrawText(text, new Point(96 * 0.25, 96 * 0.25));
            }

            // Add the title to the visual.
            newVisual.Children.Add(header);

            // Wrap the visual in a new page.
            DocumentPage newPage = new DocumentPage(newVisual);
            return newPage;
        }

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top