0

我正在尝试编写一个充当打印后台处理程序的服务:它等待文档打印并使用正确的设置(存储在 PrintTicket 中)在正确的打印机上打印。

每次出现一堆文档时,都会为每个设置创建一个线程,并且这些文档会在它们的线程中并行打印。

当我使用 WPF 应用程序时它可以工作,但是当我在 Windows 服务中使用相同的代码时,我在 PrintDialog.PrintVisual 函数调用上收到此错误:

调用线程无法访问此对象,因为不同的线程拥有它

当谷歌搜索这个错误时,我经常会看到这个线程安全打印对话框,但它不提供 PrintVisual 函数。

关于如何摆脱这个错误的任何其他想法?

谢谢你的帮助

4

1 回答 1

0

问题是您尝试打印的文档或视觉对象当前显示在 UI 线程上。为了解决这个问题,您需要重新创建视觉效果。这意味着您需要类似复制构造函数的东西。这意味着您需要执行的操作ControlX doc = new ControlX(visualToPrint)将在非 UI 线程上创建对控件的新引用。从那时起,由于线程创建了它自己的控件副本,它现在可以更改它并按照它想要的方式打印它。

请记住,在成功重新创建控件后,您需要强制执行新的布局传递,因为您没有调用.Show(). 通过调用来做到这一点:

.Measure(Rect); .Arrange(Point, Rect); .UpdateLayout();

于 2014-12-18T05:40:32.203 回答