web-dev-qa-db-fra.com

Impression en C # (wpf)

Je fais un programme C # WPF, et mon programme doit être capable d'imprimer des factures, mais j'ai du mal à savoir comment fonctionne l'impression dans WPF ... Si je me souviens bien de la programmation dans Winforms, vous utilisez 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'orienter dans la bonne direction avec des liens vers des documents utiles ou des exemples ...

23
Sander Declerck

L'impression dans WPF est à la fois simple et pas si simple. Mais pour vous indiquer un article d'introduction, facile à trouver avec google, regardez ici .

Cela commence par 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 ne se fait pas avec une seule ligne de code. Ensuite, vous accédez à FlowDocuments et à des sujets similaires plus avancés.

Si vous créez un outil non commercial pour vous-même, pensez à iTextSharp qui est très bien aussi.

26
Jaapjan

Si vous voulez imprimer tous les enregistrements de la grille de données dans WPF.Dans lequel j'ai créé un document de flux à l'aide de code, vous pouvez comprendre la logique et le faire selon vos propres exigences.Après beaucoup de travail.J'ai fait du code récemment.Il s'agit de code testé. Il imprimera chaque datagrid avec tous les enregistrements.C'est un code facile et simple.Vous ajouteriez une classe.Si vous voulez décorer un datagrid, allez dans la classe PrintDG puis décorez-le selon vos besoins.
Suivez ces étapes.
Étape 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;

Étape 2: ajoutez la 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, "");

        }
    }

}

Étape 2: Ensuite, allez à l'événement de clic du bouton d'impression et créez un objet de la classe PrintDG puis appelez printDG passez à It deux paramètres datagridname et title.
Comme :

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

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

Si une erreur se produit pendant l'exécution, dites-moi que je vais le résoudre.

3
Muhammad Mehdi

Ces liens peuvent vous aider à comprendre le fonctionnement de l’impression et ce qu’il faut exactement utiliser:

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

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

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

1
Mamta D