用C#打印(wpf)

San*_*rck 23 c# printing wpf

我正在制作一个C#WPF程序,我的程序必须能够打印发票,但我很难找到WPF中的打印方式...如果我记得winforms中的编程,那么你就是使用GDI +打印.但是,我认为WPF不是这种情况.

如果有人能指出我正确的方向,并提供有用的文件或示例的链接,我将非常高兴...

Jaa*_*jan 26

在WPF中打印既简单又不那么简单.但是要指出一篇很容易找到谷歌的介绍文章,请看这里.

它首先基本上是您要打印的一行或两行代码.

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

但是,WPF中的分页不是使用一行代码完成的.然后,您将进入FlowDocuments和类似的更高级主题.

如果您正在为自己制作非商业工具,请考虑iTextSharp也非常好.

  • 你的评论"很容易找到谷歌"有点居高临下,我发现你的链接不再有效具有讽刺意味.当我用Google搜索"C#WPF Printing"时,这是我找到的第一页.我经常在查看其他任何内容之前先去StackOverflow,原因很多,包括我认识到布局的事实,我可以很容易地看到帖子有多旧,因此信息是最新的. (17认同)
  • 历史文章可以在这里检索:https://web.archive.org/web/20091025074908/http://www.eggheadcafe.com/tutorials/aspnet/9cbb4841-8677-49e9-a3a8-46031e6​​99b2e/wpf-printing- and-print-pr.aspx 有趣的是单击“打印机友好版本”使其更具可读性。 (2认同)

Muh*_*hdi 5

如果你想在WPF中打印datagrid中的所有记录。其中我使用代码创建流文档,你可以理解逻辑并根据自己的要求制作。经过大量工作。我最近做了代码。这是经过测试的代码。它将打印包含所有记录的每个数据网格。这是简单而简单的代码。您将添加一个类。如果您想装饰一个数据网格,请转到 PrintDG 类,然后根据自己的要求进行装饰。
按着这些次序。
步骤 1:在顶部添加这些引用。

 using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
Run Code Online (Sandbox Code Playgroud)

Step2:添加类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, "");

        }
    }

}
Run Code Online (Sandbox Code Playgroud)

Step2:然后去打印按钮点击事件并创建PrintDG类的对象然后调用printDG传递给它两个参数datagridname和title。
喜欢 :

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

 print.printDG(datagridName, "Title");
}
Run Code Online (Sandbox Code Playgroud)

如果在执行过程中出现任何错误,请告诉我我会解决它。正在运行的代码只有你复制和过去。