سؤال

هل هناك أي طريقة لطباعة في جمع الذاكرة أو حجم متغير في برنامج الأغذية العالمي؟

وأنا باستخدام التعليمات البرمجية التالية التي I طباعة تحكم ListView. ولكن عندما يكون المحتوى أكبر من شريط التمرير العمودي مقاليد الامور ويقطع المحتوى.

 PrintDialog printDialog = new PrintDialog();
                printDialog.ShowDialog();

                printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
هل كانت مفيدة؟

المحلول

لطباعة صفحات متعددة تحتاج فقط إلى استخدام فئة التي تطبق DocumentPaginator FixedDocument هي واحدة من تطبيقات أكثر تعقيدا، FlowDocument هو واحد أكثر بساطة.

FlowDocument fd = new FlowDocument();

foreach(object item in items)
{
    fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
}

fd.Print();

أو

PrintDialog pd = new PrintDialog();
pd.PrintDocument(fd);

نصائح أخرى

وFixedDocument يدعم ربط البيانات (ما عدا FlowDocument) مثل أي وثيقة XAML أخرى. مجرد استضافة ListView في لfixeddocument وعرضه في DocumentViewer (الذي بني في دعم الطباعة).

ولكن، إذا كان قائمتك طويلة جدا عن صفحة واحدة، FixedDocument لا يتم تلقائيا إنشاء صفحة جديدة (مثل flowdocument لا). لذلك عليك ان إنشاء صفحة جديدة maually مع رمز، وهذا لا يمكن أن يتم في XAML النقي.

إذا كنت تريد طباعة جميلة من WPF تحتاج إلى بناء FixedDocument والطباعة التي، للأسف يمكن أن تكون معقدة جدا اعتمادا على ما كنت تحاول الطباعة.

وهناك بعض الأمثلة التعليمات البرمجية التي يخلق FixedDocument هنا: http://www.ericsink.com /wpf3d/B_Printing.html

إليك إجابة 2019. بعض الإجابات القديمة لا تعمل بعد الآن، على سبيل المثال. FlowDocumentReader لايوجد طريقة Print.

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            FlowDocument fd = new FlowDocument();
            foreach (var item in COLLECTION) //<- put your collection here
            {
                fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
            }

            PrintDialog pd = new PrintDialog();
            if (pd.ShowDialog() != true) return;

            fd.PageHeight = pd.PrintableAreaHeight;
            fd.PageWidth = pd.PrintableAreaWidth;

            IDocumentPaginatorSource idocument = fd as IDocumentPaginatorSource;

            pd.PrintDocument(idocument.DocumentPaginator, "Printing Flow Document...");
        }
    }

ومثيرة للاهتمام، هل الظاهرية يكون ListView؟ إذا كان كذلك، لا يتم رسمها الكائن، وهذا هو الاحتمال. نلقي نظرة على طباعة من بيتزولد.

وهنا هو بلدي حل لهذه المشكلة. ومن مهزوزة نوعا ما ولكنها تعمل لسيناريو بلدي.

وقرأت مجموعتي وتحويلها إلى سلسلة. يوجد مجموعة كاملة الآن في كائن ل StringBuilder. بعد ذلك، رأيت نص / سلسلة في ملف على جهاز العميل ثم قم بتشغيل عملية المفكرة مع / p لطباعة محتويات الملف.

وكان يعمل ويطبع محتويات بنجاح.

وأخيرا، هناك جهاز توقيت وهو ما يسمى بعد 5 ثوان، والذي يزيل الملف. أساسا في غضون 5 ثوان يتم إرسال طلب بالفعل إلى قائمة انتظار الطابعة. ولكن أفضل حل سيكون للتأكد من أن مهمة الطباعة قد تم تجهيزها بهذه الطريقة سوف تكون على يقين من 100٪ التي تم تنفيذ المهمة.

scroll top