2010-09-08 23 views
2

Voici la situation.WPF FlowDocument Page Break/Positionnement

Je suis chargé de générer automatiquement un document assez volumineux composé d'un certain nombre de sections distinctes de hauteur variable et de largeur constante (pleine page).

Chaque section est constituée de deux sous-sections distinctes. Pensez à eux comme "en-tête" et "données". Le problème, alors, est: Lorsqu'une seule section correspond à une page (car elle contient beaucoup de données), l'en-tête devrait s'afficher tout en haut et les données devraient s'afficher tout en bas, laissant toute espace dans le centre. Lorsque plus d'une section correspond à une page, tout devrait "s'écraser vers le haut", ne laissant aucun espace entre les sous-sections, ou même les sections. Tout l'espace supplémentaire devrait être au fond.

Quelles sortes de constructions puis-je utiliser pour accomplir ceci?

Peut-être que c'est une tâche mieux adaptée à un FixedDocument? J'ai un assez gros livre sur WPF, mais il mentionne à peine FixedDocuments.

Répondre

2

Vous ne savez pas si vous êtes toujours confronté à ce problème, mais vous pouvez essayer d'utiliser FlowDocument. Si vous écrivez un wrapper autour de DocumentPaginator, vous pourrez insérer un en-tête dans le flowdoc. En outre, vous pouvez définir flowdoc.PagePadding sur une valeur personnalisée, en tenant compte de printablePageHeight et de la hauteur de votre taille de contenu.

Voici un exemple d'une enveloppe autour de la DocumentPaginator que je suis arrivé du livre: Pro WPF en C# 2008 - Mathew MacDonald

Hope it helps. (PS Je viens de copier et coller la valeur par défaut donc n'a pas ajouté de calculs personnalisés, 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; 
     } 

    } 
}