none
Comment imprimer le contenu de fenêtres wpf ? RRS feed

  • Question

  • Bonjour,
    je cherche à imprimer le contenu graphique des fenêtres de mon application WPF.
    Dans un deuxième temps, j'aurai souhaiter pouvoir faire une mise en page de certaines données avant de pouvoir les imprimer avec un preview (genre mon application contient une zone de liste => je propose un joli tableau qui contient toutes les données de la liste même celles qui ne sont pas visibles).

    J'ai testé le "PrintDocument" mais le namespace dans lequel il se trouve n'existe pas pour les projets wpf.
    Je n'ai trouvé de valable que la classe : PrintDialog, mais je n'arrive pas à en faire ce que je veux.

    Quelqu'un sait-il comment on peux faire des impressions dans un projet WPF?

    Merci d'avance...

    Dohz.

    The whathappen man!?
    lundi 9 mars 2009 11:39

Réponses

  • Bonjour,
    Il faut effectivement utiliser la classe PrintDialog.
    Dans l'exemple ci-dessous, vous pouvez soit imprimer de l'UI grâce à la méthode PrintVisual soit imprimer du texte formaté.
    Le contrôle FlowDocument est relativement riche en termes de mise en page. Toutefois la mise en œuvre est assez lourde si l’on souhaite imprimer un document complexe (texte, mise en forme, images etc).

    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Documents;
    using System.Windows.Markup;
    
    namespace WpfApplication2
    {
        public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();
            }
    
            private void Button_Click(object sender, RoutedEventArgs e)
            {
                var printDlg = new PrintDialog();
                if (printDlg.ShowDialog() == true)
                {
                    // Impression du contenu de l'écran.
                    printDlg.PrintVisual(this, "Titre de l'impression écran");
    
                    // Impression d'une page pouvant contenir du texte formaté
                    var fixedDocument = new FixedDocument();
                    var fowDoc = new FlowDocument();
                    var reFax = new RichTextBox(fowDoc);
                    reFax.Margin = new Thickness(20, 30, 0, 0);
    
                    // Création d'une nouvelle page avec ajout de texte.
                    PageContent pageFax = CreatePage(reFax);
                    AddText(fowDoc, "Texte à imprimer");
                    fixedDocument.Pages.Add(pageFax);
    
                    // Création d'une nouvelle page vierge
                    var flow = new FlowDocument();
                    var re = new RichTextBox(flow);
                    re.Margin = new Thickness(20, 30, 0, 0);
                    PageContent page = CreatePage(re);
                    fixedDocument.Pages.Add(page);
    
    
                    fixedDocument.DocumentPaginator.PageSize = new Size(90*8.5, 96*14);
                    printDlg.PrintDocument(fixedDocument.DocumentPaginator, "Titre de l'impression");
                }
            }
    
            private static void AddText(FlowDocument flow, string section)
            {
                var paragraph = new Paragraph();
                var sp = new Span(new Run(section));
                sp.FontSize = 14;
                sp.FontWeight = FontWeights.Bold;
                paragraph.Inlines.Add(sp);
    
                flow.Blocks.Add(paragraph);
            }
    
            private static PageContent CreatePage(FrameworkElement re)
            {
                re.Width = 90*8.5;
                re.Height = 90*11;
                var page = new PageContent();
                var fixedPage = new FixedPage();
                fixedPage.Children.Add(re);
                ((IAddChild) page).AddChild(fixedPage);
                return page;
            }
        }
    }
    Pascal.
    mardi 23 juin 2009 10:11