VB.net PrintForm不能在新线程中工作

时间:2017-08-19 22:07:15

标签: vb.net

我正在开发一个电子申请应用程序,我需要打印一个带有一些信息的粘性标签,以附加到物理文件夹。

我已经将标签设计为表格,将标识和我需要的所有东西放在那里。然后在Form.Shown事件上我将命令打印到:

Me.PrintLabelForm.Print()(这是VisualStudio PowerPack控件)

这是我遇到问题的地方。打印输出完全是空的(我已经更改了设置打印机的边距等)。问题是窗体实际上没有完全加载,我将方法切换到打印预览,控件在那里,但它们是空的。

我尝试了几种方法,但我无法自动执行此操作。我找到的一个解决方案是有一个按钮来执行Me.PrintLabelForm.Print()然后它可以工作,因为表单已经完全加载并显示但是这不是一个选项。我需要表单自动打开,打印和关闭。

我认为它应该工作的一个选项是有一个带有计时器的新线程然后打印所以我这样做了:

Private Sub LabelPrint_Load(sender As Object, e As EventArgs) Handles MyBase.Load

End Sub

Private Sub LabelPrint_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Left = 0.1
    PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Right = 0.1
    PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Top = 0.1
    PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Bottom = 0.1
    PrintLabelForm.PrinterSettings.DefaultPageSettings.Landscape = True

    Dim PrintThread As New System.Threading.Thread(AddressOf PrintSub)
    PrintThread.Start()
End Sub

Private Sub PrintSub()
    Threading.Thread.Sleep(1000)
    Me.PrintLabelForm.Print()
    Me.Close()
End Sub

我的想法是让PrintSub给应用程序足够的时间来渲染整个事物然后打印但是我收到了这个错误:

**未处理的类型' System.Exception'发生在Microsoft.VisualBasic.PowerPacks.dll

附加信息:正在打印的窗口必须可见且包含焦点。**

所以我想知道如何使这个线程具有焦点窗口形式,以便能够打印。

就是这样。感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

始终只使用主线程中的表单。

您发现它正确 - 表单打印不会从新线程运行。

当您对表单执行任何操作时,您必须从Dispatcher线程执行所有工作。它是运行所有事件方法的线程。如果你没有这样做,你可能会遇到很多副作用。 (不仅印刷问题。我一直在那里,高级Windows程序员的建议帮助我恢复正常。)所以不要使用任何其他线程的表格打印。

如果您需要解决此方法,请将表单打印到图像(在主线程中),然后您可以使用新线程打印图像。

这与.NET无关,这与Windows Forms技术的内部相关。欢迎使用Windows编程。

答案 1 :(得分:0)

我设法解决这个问题,将这一行放在Form.Shown

PrintLabelForm.Print(Me, PrintForm.PrintOption.ClientAreaOnly)

我不知道为什么或如何但它有效。

感谢你们所有人的帮助。我希望当表单完全显示时,我发现自己并没有尝试做任何事情。

这是我的完整代码,希望它适用于其他人:

Imports Microsoft.VisualBasic.PowerPacks.Printing

Public Class PrintAdhesiveLabel

    Private Sub LabelPrint_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Private Sub LabelPrint_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Left = 0.1
        PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Right = 0.1
        PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Top = 0.1
        PrintLabelForm.PrinterSettings.DefaultPageSettings.Margins.Bottom = 0.1
        PrintLabelForm.PrinterSettings.DefaultPageSettings.Landscape = True
        PrintLabelForm.Print(Me, PrintForm.PrintOption.ClientAreaOnly)
        Me.Close()
    End Sub

End Class

答案 2 :(得分:-1)

或许this是相关的:

  

使用此功能,只能打印当前具有焦点的表单   方法。如果您之前已将Form属性设置为另一个表单   调用此方法时,表单的图像可能不会呈现为   预期。要避免这种情况,请在您之前调用表单的Focus方法   打印打印。

请在致电Me.PrintLabelForm.Focus()之前致电Me.PrintLabelForm.Print()

Private Sub PrintSub()
    Threading.Thread.Sleep(1000)
    Me.PrintLabelForm.Focus()
    Me.PrintLabelForm.Print()
    Me.Close()
End Sub