首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows8.1中打印WPF FixedPage时引用为空

在Windows8.1中打印WPF FixedPage时引用为空
EN

Stack Overflow用户
提问于 2019-03-22 23:22:49
回答 2查看 53关注 0票数 1

我有一个.net框架v4.7.2WPF应用程序,它打印了在Windows7上运行没有任何问题的FixedPage,但在Windows8.1上运行它时遇到了一些问题。

下面的代码块是导致问题的原因:

代码语言:javascript
复制
private void Print()
{
    using (var printQueue = LocalPrintServer.GetDefaultPrintQueue())
    {
        var printTicket = printQueue.DefaultPrintTicket;
        var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
        writer.WritingCompleted += OnDocumentWritten;
        writer.WriteAsync(View.LabelPageView.AddressLabelPage, printTicket);
    }
}

它抛出一个带有以下堆栈跟踪的NullReferenceException

代码语言:javascript
复制
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Collections.Hashtable.get_Item(Object key)
   at System.Printing.PrintQueue.get_IsXpsDevice()
   at System.Printing.PrintQueue.ForwardXpsDriverDocEvent(Object sender, XpsSerializationXpsDriverDocEventArgs args)
   at System.Windows.Xps.Serialization.XpsSerializationManager.OnXpsDriverDocEvent(XpsSerializationXpsDriverDocEventArgs e)
   at System.Windows.Xps.Serialization.XpsDriverDocEventManager.OnXpsDriverDocEvent()
   at System.Windows.Xps.Serialization.XpsDriverDocEventManager.ForwardPackagingProgressEvent(Object sender, PackagingProgressEventArgs e)
   at System.Windows.Xps.Packaging.PackagingProgressEventHandler.Invoke(Object sender, PackagingProgressEventArgs e)
   at System.Windows.Xps.Packaging.XpsInterleavingPolicy.AddItem(INode n, Int32 number, INode parent)
   at System.Windows.Xps.Serialization.XpsPackagingPolicy.AcquireXmlWriterForFixedPage()
   at System.Windows.Xps.Serialization.XpsSerializationManager.AcquireXmlWriter(Type writerType)
   at System.Windows.Xps.Serialization.FixedPageSerializerAsync.get_XmlWriter()
   at System.Windows.Xps.Serialization.ReachTreeWalker..ctor(ReachSerializer serializer)
   at System.Windows.Xps.Serialization.FixedPageSerializerAsync.PersistObjectData(SerializableObjectContext serializableObjectContext)
   at System.Windows.Xps.Serialization.ReachSerializerAsync.BeginSerializeObject(Object serializedObject)
   at System.Windows.Xps.Serialization.FixedPageSerializerAsync.SerializeObject(Object serializedObject)
   at System.Windows.Xps.Serialization.XpsSerializationManagerAsync.InvokeSaveAsXamlWorkItem(Object arg)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)

如果我用writer.Write(...)替换writer.WriteAsync(...),这个错误就会消失。

我已经能够在Windows8.1、Windows Server2012 R2和Windows Server2016上重现该错误。我无法在Windows 10上重现该错误。

对如何在Windows 8.1上异步打印有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-25 15:37:32

@rene的回答解决了这个问题,所以很明显,问题是PrintQueue在打印完成之前就被处理了。

代码语言:javascript
复制
private void Print()
{
    var printQueue = LocalPrintServer.GetDefaultPrintQueue()
    var printTicket = printQueue.DefaultPrintTicket;
    var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
    writer.WritingCompleted += OnDocumentWritten;
    writer.WriteAsync(View.LabelPageView.AddressLabelPage, printTicket);
}

然而,代码在Windows10上运行,而不是Windows8.1,这看起来确实很奇怪。

票数 0
EN

Stack Overflow用户

发布于 2019-03-22 23:30:32

您可以将方法设为async,然后使用await进行异步调用。

试试这个:

代码语言:javascript
复制
private async Task Print()
{
    using (var printQueue = LocalPrintServer.GetDefaultPrintQueue())
    {
        var printTicket = printQueue.DefaultPrintTicket;
        var writer = PrintQueue.CreateXpsDocumentWriter(printQueue);
        writer.WritingCompleted += OnDocumentWritten;
        await writer.WriteAsync(View.LabelPageView.AddressLabelPage, printTicket);
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55302872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档