WPF FlowDocument Page Break/Positioning
-
01-10-2019 - |
質問
これが状況です。
さまざまな高さと一定の(フルページ)幅の多数の異なるセクションで構成されるかなり大きなドキュメントを自動生成することを任されています。
各セクションは、2つの異なるサブセクションで構成されています。それらを「ヘッダー」および「データ」と考えてください。
問題は次のとおりです。ページに1つのセクションのみが適合する場合(多くのデータがあるため)、ヘッダーが最上部に表示され、データが最下部に表示され、使用されていないスペースが中央に表示されます。
複数のセクションがページに適合する場合、すべてが「上部につなぐ」必要があり、サブセクション、またはセクションの間にスペースを残しません。余分な空白はすべて下部にあるはずです。
これを達成するためにどのような構造を使用できますか?
おそらく、これは固定文書に適したタスクですか?私はWPFにかなり大きな本を持っていますが、それは固定ドキュメントについてほとんど言及していません。
解決
まだこの問題と戦っているかどうかはわかりませんが、FlowDocumentを使用してみることができます。
DocumentPaginatorの周りにラッパーを書くと、HeaderをFlowDocに挿入できます。また、PrintablePageHeightとコンテンツサイズの高さを考慮して、FlowDoc.PagePaddingをカスタム値に設定することもできます。
これは、私が本から得たドキュメントパジネーターの周りのラッパーの例です:C#2008のプロWPF -Mathew MacDonald
それが役に立てば幸い。 (ps。デフォルトをコピーして貼り付けたばかりなので、カスタム計算などは追加されませんでした。)
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;
}
}
}
所属していません StackOverflow