"调用线程必须是STA,因为许多UI组件都需要这个." WPF出错?

Ers*_*had 3 wpf exception xps

我正在创建一个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;
Run Code Online (Sandbox Code Playgroud)

当我想要获取docXps.GetFixedDocumentSequence(); 我收到了上述错误.有人可以帮忙吗?

谢谢,

Ray*_*rns 18

您的问题与创建或使用XPS文档的代码无关.它与您运行的线程有关.

The calling thread must be STA, because many UI components require this只要在MTA线程上尝试以下任何操作,您将收到错误:

  • 您构造派生自FrameworkElement的任何对象(包括控件和面板)
  • 您构造从BitmapEffect派生的任何对象
  • 您构造从TextComposition派生的任何对象
  • 您构造从HwndSource派生的任何对象
  • 您可以访问当前的InputManager
  • 您可以访问主要的KeyboardDevice,StylusDevice或TabletDevice
  • 您尝试更改FrameworkContentElement的焦点
  • 您为任何接受文本输入的控件提供鼠标,键盘或IME输入
  • 您可以使WPF内容可见或更新其布局
  • 您以这样一种方式操纵可视树,以便重新评估渲染
  • 其他几个变化,主要与显示和输入有关

例如,去年我尝试<Button>从WCF服务中反序包含一些包含其他WPF对象的XAML时收到此错误.问题很容易解决:我只是切换到STA线程来进行处理.

显然,大多数使用XPS文档的工作都会触发上述一个或多个条件.在您的情况下,我怀疑GetFixedDocumentSequence最终使用TextComposition或其子类之一.

毫无疑问,我切换到STA线程的解决方案也适用于您,但首先您需要弄清楚如何从MTA线程执行与XpsDocuments一起使用的代码.通常,来自GUI的任何代码(例如按下按钮)都自动在STA线程中运行.

操作XPS文档的代码是否可能在没有GUI的情况下执行?从用户创建的线程?从WCF服务或Web服务?从ASPX页面? 跟踪它,你可能会找到你的解决方案.

如果这不起作用,请告诉我们调用GetFixedDocumentSequence的路径的详细信息,以便我们对其进行诊断.直接包围的代码并不像调用堆栈那样重要,以及它最初是如何被调用的.如果很难解释你可能应该添加一个调用堆栈以防止误解并帮助我们进一步诊断问题,或者告诉你如何在特定情况下启动STA线程.