Печать в C # (wpf) - PullRequest
       22

Печать в C # (wpf)

22 голосов
/ 14 апреля 2011

Я делаю программу на C # WPF, и моя программа должна иметь возможность распечатывать счета, но я немного пытаюсь выяснить, как работает печать в WPF ... Если я хорошо помню из программирования в winforms, то естьвы бы использовали GDI + для печати.Тем не менее, я полагаю, что это не так с WPF.

Я был бы очень рад, если бы кто-то мог указать мне правильное направление с некоторыми ссылками на полезные документы или примеры ...

Ответы [ 3 ]

24 голосов
/ 14 апреля 2011

Печать в WPF проста и не так проста. Но чтобы указать вам на вводную статью, которую легко найти в Google, посмотрите здесь .

Он начинается с одной или двух строк кода, которые вы уже печатаете.

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

Однако разбиение на страницы в WPF не выполняется ни одной строкой кода. Затем вы попадаете в FlowDocuments и подобные более сложные темы.

Если вы делаете некоммерческий инструмент для себя, рассмотрите iTextSharp , что тоже очень хорошо.

2 голосов
/ 11 мая 2018

Если вы хотите распечатать все записи из таблицы данных в WPF. В которых я создал потоковый документ, используя код, вы можете понять логику и сделать ее в соответствии с собственными требованиями. После большой работы. Я недавно сделал код. протестированный код. Он напечатает каждую сетку данных со всеми записями. Это простой и простой код. Вы должны добавить класс. Если вы хотите украсить сетку данных, перейдите в класс PrintDG и затем украсьте его в соответствии с собственными требованиями.
Выполните следующие действия.
Шаг 1: Добавьте эти ссылки сверху.

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

Шаг 2: Добавить класс 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, "");

        }
    }

}

Шаг 2: Затем перейдите к событию нажатия кнопки печати и создайте объект класса PrintDG, затем вызовите printDG и передайте ему два параметра: datagridname и title.
Нравится:

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

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

Если во время выполнения возникнет какая-либо ошибка, скажите мне, что я ее решу. Выполняется только код, который вы копируете и прошёл.

0 голосов
/ 14 апреля 2011

Эти ссылки могут помочь вам понять, как работает печать и что именно использовать:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...