2010-09-08 172 views
2

這就是情況。WPF FlowDocument分頁/定位

我負責自動生成一個由大量不同高度和常量(整頁)寬度的不同部分組成的相當大的文檔。

每個部分由兩個不同的子部分組成。把它們想象成「標題」和「數據」。

問題是: 當頁面上只有一個部分適合(因爲它有很多數據)時,頁眉應該顯示在最上面,數據應該顯示在最下面,留下任何未使用的空間在中心。

當多個節在頁面一切都適合應「嘎吱頂端」,留下小節,甚至部分之間沒有空格。所有額外的空白應該在底部。

我可以用什麼樣的構造來實現這個?

也許這是一個更適合FixedDocument的任務?我有一本關於WPF的書,但它幾乎沒有提到FixedDocuments。

回答

2

不知道你是否仍在與這個問題作鬥爭,但你可以嘗試使用FlowDocument。

如果你在DocumentPaginator上編寫一個包裝器,你將能夠在flowdoc中插入一個頭文件。另外,您可以將flowdoc.PagePadding設置爲自定義值,同時考慮到printablePageHeight和內容大小的高度。

這裏是圍繞DocumentPaginator的包裝,我從書中得到的一個例子:臨WPF在C#2008 - 馬修·麥克唐納

希望它能幫助。 (PS。我只是複製和粘貼默認所以沒有添加任何自定義Calcs(計算)等)

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

    } 
}