几年前我写了一个WPF(基于Visual Basic 2012)应用程序,其中包括使用标准WPF printdialogs / paginators / features“打印”一些报告.... 从那时起(2011/2015),每个人都工作得很好,我没有改变那个工作代码的一行...... 现在我不得不改变一些东西(不是打印相关的)到那个项目,当然我也检查了打印功能...... 现在“打印”代码在使用时失败...实际上不是“paginator”代码,但访问PrintTicket / Que对象失败报告 “PrintTicket提供程序无法将PrintTicket转换为DEVMODE。Win32错误:参数不正确。”
但它很奇怪,因为它并不总是失败,并且它因不同的打印机而有所不同...... 使用例如“PDF Creator”虚拟打印机,它无法写入/设置我的Que对象的某些属性而不是其他属性,而使用其他打印机失败则对其他打印机失败... 例如,PDF Creator虚拟打印机:
1)myQue.DefaultPrintTicket = myTicket = OK 2)myQue.CurrentJobSettings.Description =“some title”=使用某些打印机确定,使用不同打印机的FAILS
但是2)仅在第一次设置时失败,并且我可以通过少量时间睡眠“解决”“循环”几次......再次,第二次或第三次成功... 所以我写了一个丑陋的代码,如
Dim dlg As New PrintDialog .....
myTicket = dlg.PrintTicket
myQue = dlg.PrintQueue
“-----
'检查循环是否有趣
'属性已设置
Dim ticketIsSet(1)As Boolean
对于iLoop As Integer = 1到5
'it can fail with DEVMODE = NULL
Try
If Not ticketIsSet(0) Then
myQue.DefaultPrintTicket = myTicket
ticketIsSet(0) = True
End If
If Not ticketIsSet(1) Then
myQue.CurrentJobSettings.Description = Me.Title
ticketIsSet(1) = True
End If
Catch ex As Exception
Errors.Add(ex.Message)
System.Threading.Thread.CurrentThread.Sleep(1000)
End Try
If ticketIsSet(0) AndAlso ticketIsSet(1) Then Exit For
下一步
如果是Errors.Count那么
' it's still ok if title can't be set... :(
If ticketIsSet(0) Then Errors.Clear()
结束如果
到目前为止,“非常好”,因为我完成了工作...但只是部分...因为我的Paginator习惯(成功)填充System.Windows.Controls.DocumentViewer ...这个备用documentviewer窗口以后如果要求可以打印... 再次,使用不同的打印机它成功或失败“PrintTicket提供程序无法将PrintTicket转换为DEVMODE.Win32错误:参数不正确。”异常......
使用PDF Creator虚拟打印机它成功了,使用不同的物理打印机它失败了......
我尝试了与上面相同的循环技巧,比如
Dim Errors As New Specialized.StringCollection
Dim bDone As Boolean = False
对于iLoop As Integer = 1到5
Try
Dim writer As System.Windows.Xps.XpsDocumentWriter = System.Printing.PrintQueue.CreateXpsDocumentWriter(m_printQueue)
writer.Write(Me.docViewer.Document.DocumentPaginator, Me.m_printTicket)
writer = Nothing
bDone = True
Catch ex As Exception
Errors.Add(ex.Message)
System.Threading.Thread.CurrentThread.Sleep(1000)
End Try
If bDone Then Exit For
接着 如果bDone Then Errors.Clear()
如果Errors.Count<> 0然后BasShowErrors(错误,我,错误)
这里它失败了(再次,在一些打印机上) writer.Write(Me.docViewer.Document.DocumentPaginator,Me.m_printTicket) “PrintTicket提供程序无法将PrintTicket转换为DEVMODE。Win32错误:参数不正确。”异常......
显然,打印机在其他程序(如World,Excel等)方面还可以,并且它与所有其他(非基于WPF的)项目一样好......而且这只是“现在”发生,因为它像初步开发时的魅力......我当前的设置是:
Win7 Ultimate sp 1
SQL 2014 Dev Edition(不相关)
Visual Studio 2012 Ultimate Version 11.0.61219.00 Update 5
Microsoft .NET Framework版本4.6.01055
我甚至尝试使用NetFramwork修复工具(https://www.microsoft.com/en-us/download/details.aspx?id=30135)“修复”.NET Framework但没有成功......
非常感谢任何提示:)
ASQL