سؤال

هذا هو الوضع.

أنا مكلف بتوليد وثيقة كبيرة إلى حد ما تتكون من عدد من الأقسام المتميزة من الارتفاع المتغير وعرض ثابت (كامل الصفحة).

يتكون كل قسم من قسمين فرعيين متميزين. فكر فيهم على أنهم "رأس" و "بيانات".

المشكلة ، إذن ، هي: عندما يناسب قسم واحد فقط على صفحة (لأنه يحتوي على الكثير من البيانات) يجب أن يتم عرض الرأس في الأعلى وينبغي عرض البيانات في القاع ، تاركًا أي مساحة غير مستخدمة في المركز.

عندما يناسب أكثر من قسم على الصفحة ، يجب أن "يسحق إلى الأعلى" ، أو لا يترك أي مساحة بين الأقسام الفرعية ، أو حتى الأقسام. يجب أن تكون كل المسافة البيضاء الإضافية في القاع.

ما هي أنواع البنيات التي يمكنني استخدامها لإنجاز هذا؟

ربما هذه مهمة أكثر ملاءمة لحجة ثابتة؟ لديّ كتاب كبير إلى حد ما على WPF ، لكنه بالكاد يذكر الوثيقة الثابتة.

هل كانت مفيدة؟

المحلول

لست متأكدًا مما إذا كنت لا تزال تقاتل مع هذه المشكلة ، ولكن يمكنك محاولة استخدام FlowDocument.

إذا كتبت غلافًا حول DocumentPaginator ، فستتمكن من إدخال رأس في FlowDoc. أيضًا ، يمكنك تعيين FlowDoc.PagePadding على قيمة مخصصة ، مع مراعاة PrintablePageHeight وارتفاع حجم المحتوى الخاص بك.

إليك مثال على غلاف حول DocumentPaginator الذي حصلت عليه من الكتاب: Pro WPF في C# 2008 - ماثيو ماكدونالد

أتمنى أن يساعد ذلك. (ع

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

    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top