&引用;调用线程必须是STA,因为许多UI组件都需要它;WPF中的错误?
我正在创建一个xps文档,如下所示&引用;调用线程必须是STA,因为许多UI组件都需要它;WPF中的错误?,wpf,exception,xps,Wpf,Exception,Xps,我正在创建一个xps文档,如下所示 Assembly assembly = Assembly.GetExecutingAssembly(); //read embedded xpsDocument file Stream helpStream = assembly.GetManifestResourceStream(resourceNameOfContext); if (helpStream != null) { Package package = Package.Open(helpSt
Assembly assembly = Assembly.GetExecutingAssembly();
//read embedded xpsDocument file
Stream helpStream = assembly.GetManifestResourceStream(resourceNameOfContext);
if (helpStream != null)
{
Package package = Package.Open(helpStream);
string inMemoryPackageName = "memorystream://" + topicName + ".xps";
Uri packageUri = new Uri(inMemoryPackageName);
//Add package to PackageStore
PackageStore.AddPackage(packageUri, package);
docXps = new XpsDocument(package, CompressionOption.Maximum, inMemoryPackageName);
}
return docXps;
当我试图获取docXps.GetFixedDocumentSequence()时;
我得到了上面的错误。有人能帮忙吗
谢谢,您的代码是否试图从后台线程访问xps文档?如果是这种情况,则需要使用dispatcher。这方面的信息
如果这样做没有帮助,您是否可以在实际调用GetFixedDocumentSequence()的地方发布代码?您的问题与创建或使用XPS文档的代码无关。它与您运行的线程有关 您将收到
调用线程必须是STA,因为每当在MTA线程上尝试以下任一操作时,许多UI组件都需要此错误:
- 构造从FrameworkElement派生的任何对象(包括控件和面板)
- 可以构造从BitmapEffect派生的任何对象
- 您可以构造从TextComposition派生的任何对象
- 您可以构造从HwndSource派生的任何对象
- 您可以访问当前的InputManager
- 您可以访问主键盘设备、StylusDevice或TabletDevice
- 您试图更改FrameworkContentElement上的焦点
- 您可以向任何接受文本输入的控件提供鼠标、键盘或输入法输入
- 您可以使WPF内容可见或更新其布局
- 操纵视觉树的方式会导致重新评估渲染
- 其他一些变化,主要与显示和输入有关
例如,我去年在尝试从WCF服务中反序列化包含
和其他WPF对象的一些XAML时收到了这个错误。这个问题很容易解决:我只是切换到STA线程来进行处理
显然,大多数使用XPS文档的工作都会触发上述一个或多个条件。在您的例子中,我怀疑GetFixedDocumentSequence最终使用TextComposition或其子类之一
毫无疑问,切换到STA线程的my解决方案也适用于您,但首先您需要了解如何从MTA线程执行与XpsDocuments一起工作的代码。通常,GUI中的任何代码(如按下按钮)都会自动在STA线程中运行
操纵XPS文档的代码是否可能在没有GUI的情况下执行?从用户创建的线程?从WCF服务还是从web服务?从ASPX页面?追踪这一点,您可能会找到解决方案
如果这不起作用,请让我们知道调用GetFixedDocumentSequence的路径的详细信息,以便我们可以对其进行诊断。直接围绕的代码远不如调用堆栈及其最初的调用方式重要。如果很难解释,您可能应该添加一个调用堆栈以防止误解,并帮助我们进一步诊断问题,或者告诉您如何在特定情况下启动STA线程。您可以将代码粘贴到四个空格中以使其更具可读性吗?我正在将此xps文档指定给自定义类的属性。当我想从自定义类访问这个xpsdocument属性时,我得到了文档,但在docXps.GetFixedDocumentSequence()上得到了错误;代码如下。私有void MergeHelpDocument(HelpTopic HelpTopic,serializerWriterCollector vxpsd){try{if(HelpTopic.Document!=null){FixedDocumentSequence seqOld=HelpTopic.Document.GetFixedDocumentSequence();//这里我需要获取每个文档的文档引用(seqOld.References中的DocumentReference r){FixedDocument d=r.GetDocument(false)@Ershad:你知道你可以编辑你的问题并在其中添加代码吗?大多数人这样做是因为代码比在评论中更容易阅读。