&引用;调用线程必须是STA,因为许多UI组件都需要它;WPF中的错误?

&引用;调用线程必须是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

我正在创建一个xps文档,如下所示

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:你知道你可以编辑你的问题并在其中添加代码吗?大多数人这样做是因为代码比在评论中更容易阅读。