Impression en C# (wpf)

je fais un programme C# WPF, et mon programme doit pouvoir imprimer des factures, mais j'ai un peu de mal à trouver comment l'impression fonctionne dans WPF... Si je me souviens bien de la programmation dans winforms, vous utiliseriez GDI+ pour imprimer. Cependant, je suppose que ce n'est pas le cas avec WPF.

je serais très heureux si quelqu'un pouvait m'indiquer la bonne direction avec des liens vers des documents ou des exemples utiles...

21
demandé sur Sander Declerck 2011-04-14 13:23:46

3 réponses

L'impression dans WPF est à la fois simple et pas si simple. Mais pour vous diriger vers un article d'introduction, facilement trouvé avec google, regardez ici.

il commence avec essentiellement avec une ou deux lignes de code que vous imprimez déjà.

private void PrintBtn_Click(object sender, RoutedEventArgs e)
{
    PrintDialog printDialog = new PrintDialog();
    if (printDialog.ShowDialog() == true)
    {
    printDialog.PrintVisual(grid, "My First Print Job");
    }
}

cependant, la pagination dans WPF n'est pas faite avec une seule ligne de code. Ensuite, vous entrez dans FlowDocuments et des sujets similaires plus avancés.

si vous fabriquez un outil non commercial pour vous-même, envisagez iTextSharp ce qui est très bien aussi.

24
répondu Jaapjan 2015-01-23 22:19:46

ces liens peuvent vous aider à comprendre comment fonctionne l'impression et ce qu'il faut utiliser exactement:

http://www.charlespetzold.com/blog/2006/02/201111.html

http://msdn.microsoft.com/en-us/library/ms742418 (v = 100).aspx

http://www.switchonthecode.com/tutorials/printing-in-wpf

1
répondu Mamta D 2016-03-08 14:19:07

si vous voulez imprimer tous les enregistrements de datagrid dans WPF.Dans lequel j'ai créer le document de flux en utilisant le code, vous pouvez comprendre la logique et le faire selon ses propres exigences.Après beaucoup de travail.J'ai fait du code récemment.C'est du code testé.Il imprimera chaque datagrid avec tous les enregistrements.It is easy and simple code.Vous devez ajouter une classe.Si vous voulez décorer un datagrid puis aller à la classe PrintDG puis la décorer selon ses propres exigences.

Suivez ces étape.

Etape 1: ajoutez ces références en haut.

 using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;

Etape 2: Ajouter une classe PrintDG.cs.

  public  class PrintDG
{
         public void printDG(DataGrid dataGrid, string title)
    {



        PrintDialog printDialog = new PrintDialog();
        if (printDialog.ShowDialog() == true)
        {
            FlowDocument fd = new FlowDocument();

            Paragraph p = new Paragraph(new Run(title));
            p.FontStyle = dataGrid.FontStyle;
            p.FontFamily = dataGrid.FontFamily;
            p.FontSize = 18;
            fd.Blocks.Add(p);

            Table table = new Table();
            TableRowGroup tableRowGroup = new TableRowGroup();
            TableRow r = new TableRow();
            fd.PageWidth = printDialog.PrintableAreaWidth;
            fd.PageHeight = printDialog.PrintableAreaHeight;
            fd.BringIntoView();

            fd.TextAlignment = TextAlignment.Center;
            fd.ColumnWidth = 500;
            table.CellSpacing = 0;

            var headerList = dataGrid.Columns.Select(e => e.Header.ToString()).ToList();


            for (int j = 0; j < headerList.Count; j++)
            {

                r.Cells.Add(new TableCell(new Paragraph(new Run(headerList[j]))));
                r.Cells[j].ColumnSpan = 4;
                r.Cells[j].Padding = new Thickness(4);

                r.Cells[j].BorderBrush = Brushes.Black;
                r.Cells[j].FontWeight = FontWeights.Bold;
                r.Cells[j].Background = Brushes.DarkGray;
                r.Cells[j].Foreground = Brushes.White;
                r.Cells[j].BorderThickness = new Thickness(1, 1, 1, 1);
            }
            tableRowGroup.Rows.Add(r);
            table.RowGroups.Add(tableRowGroup);
            for (int i = 0; i < dataGrid.Items.Count; i++)
            {

                DataRowView row = (DataRowView)dataGrid.Items.GetItemAt(i);

                table.BorderBrush = Brushes.Gray;
                table.BorderThickness = new Thickness(1, 1, 0, 0);
                table.FontStyle = dataGrid.FontStyle;
                table.FontFamily = dataGrid.FontFamily;
                table.FontSize = 13;
                tableRowGroup = new TableRowGroup();
                r = new TableRow();
                for (int j = 0; j < row.Row.ItemArray.Count(); j++)
                {

                    r.Cells.Add(new TableCell(new Paragraph(new Run(row.Row.ItemArray[j].ToString()))));
                    r.Cells[j].ColumnSpan = 4;
                    r.Cells[j].Padding = new Thickness(4);

                    r.Cells[j].BorderBrush = Brushes.DarkGray;
                    r.Cells[j].BorderThickness = new Thickness(0, 0, 1, 1);
                }

                tableRowGroup.Rows.Add(r);
                table.RowGroups.Add(tableRowGroup);

            }
            fd.Blocks.Add(table);

            printDialog.PrintDocument(((IDocumentPaginatorSource)fd).DocumentPaginator, "");

        }
    }

}

Step2: puis aller à imprimer le bouton cliquer événement et créer l'objet de la classe PrintDG puis l'appel printDG passer à deux paramètres datagridname et le titre.

Comme:

private void print_button_Click(object sender, RoutedEventArgs e)
    {
            PrintDG print = new PrintDG();

 print.printDG(datagridName, "Title");
}

Si tout erorr survenir lors de l'exécution de me dire, je vais le résoudre.Le code ne s'exécute que si vous le copiez et le passiez.

1
répondu Muhammad Mehdi 2018-05-11 07:24:57