代码之家  ›  专栏  ›  技术社区  ›  azamsharp

在WPF中打印集合

  •  2
  • azamsharp  · 技术社区  · 16 年前

    是否有任何方法可以在内存集合中打印或在WPF中打印可变大小?

    我正在使用以下代码打印ListView控件。但当内容大于垂直滚动条时,滚动条会接管并剪切内容。

     PrintDialog printDialog = new PrintDialog();
                    printDialog.ShowDialog();
    
                    printDialog.PrintVisual(lvDocumentSummary, "testing printing!");
    
    5 回复  |  直到 12 年前
        1
  •  6
  •   Ifeanyi Echeruo    16 年前

    要打印多个页面,只需使用实现documentpaginator fixedDocument的类是更复杂的实现之一,FlowDocument是一个更简单的实现。

    FlowDocument fd = new FlowDocument();
    
    foreach(object item in items)
    {
        fd.Blocks.Add(new Paragraph(new Run(item.ToString())));
    }
    
    fd.Print();
    

    PrintDialog pd = new PrintDialog();
    pd.PrintDocument(fd);
    
        2
  •  2
  •   Joachim Kerschbaumer    16 年前

    FixedDocument与任何其他XAML文档一样支持数据绑定(FlowDocument除外)。只需将ListView宿主在FixedDocument中,并将其显示在DocumentViewer中(它具有内置的打印支持)。

    但是,如果列表对于一个页面太长,FixedDocument不会自动生成新页面(就像FlowDocument那样)。因此,您必须使用代码创建一个新页面,因为这不能在纯XAML中完成。

        3
  •  0
  •   Nir    16 年前

    如果您希望从WPF进行良好的打印,您需要构建一个FixedDocument并打印它,不幸的是,它可能非常复杂,具体取决于您要打印的内容。

    这里有一些创建FixedDocument的示例代码: http://www.ericsink.com/wpf3d/B_Printing.html

        4
  •  -1
  •   Artur Carvalho    16 年前

    有趣的是,ListView是虚拟化的吗?如果是这样,物体就不会被画出来,这是可能的。看看印刷品 example 来自彼得霍尔德。

        5
  •  -4
  •   azamsharp    16 年前

    这是我解决这个问题的方法。这有点不稳定,但适用于我的场景。

    我读了我的收藏并把它转换成一个字符串。整个集合现在驻留在一个StringBuilder对象中。接下来,我在客户机的一个文件中看到了文本/字符串,然后用/p运行记事本进程来打印文件的内容。

    它工作,并且成功地打印内容。

    最后,还有一个计时器,它在5秒后调用并删除文件。基本上在5秒内,请求已经发送到打印机队列。但更好的解决方案是确保打印作业已通过这种方式处理,您将100%确保作业已执行。