3

以下のように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(); を取得しようとしているとき 上記のエラーが発生しています。誰でも助けることができますか?

ありがとう、

4

2 に答える 2

19

問題は、XPSドキュメントの作成または使用を取り巻くコードとは何の関係もありません。それはあなたが実行しているスレッドと関係があります。

The calling thread must be STA, because many UI components require thisMTAスレッドで次のいずれかを試行すると、エラーが発生します。

  • FrameworkElementから派生したオブジェクト(コントロールとパネルを含む)を作成します
  • BitmapEffectから派生したオブジェクトを作成します
  • TextCompositionから派生したオブジェクトを作成します
  • HwndSourceから派生したオブジェクトを作成します
  • 現在のInputManagerにアクセスします
  • プライマリKeyboardDevice、StylusDevice、またはTabletDeviceにアクセスします
  • FrameworkContentElementのフォーカスを変更しようとしています
  • テキスト入力を受け入れる任意のコントロールにマウス、キーボード、またはIME入力を提供します
  • WPFコンテンツを表示するか、そのレイアウトを更新します
  • レンダリングの再評価を引き起こすような方法でビジュアルツリーを操作します
  • 他のいくつかの変更、主に表示と入力に関係する

たとえば、昨年<Button>、WCFサービス内から他のWPFオブジェクトを含む一部のXAMLを逆シリアル化しようとしたときに、このエラーが発生しました。問題の解決は簡単でした。処理を行うためにSTAスレッドに切り替えるだけです。

明らかに、XPSドキュメントでのほとんどの作業は、上記の条件の1つ以上をトリガーします。あなたの場合、GetFixedDocumentSequenceがTextCompositionまたはそのサブクラスの1つを使用することになったのではないかと思います。

STAスレッドに切り替えるという私の解決策もうまくいくことは間違いありませんが、最初に、XpsDocumentsで動作するコードがMTAスレッドからどのように実行されるかを理解する必要があります。通常、GUIからのコード(ボタンを押すなど)は、STAスレッドで自動的に実行されます。

XPSドキュメントを操作するコードがGUIなしで実行されている可能性はありますか?ユーザーが作成したスレッドから?WCFサービスまたはWebサービスからですか?ASPXページから? それを追跡すれば、おそらくあなたの解決策が見つかるでしょう。

それでも問題が解決しない場合は、GetFixedDocumentSequenceが呼び出されるパスの詳細をお知らせください。診断できるようになります。直接周囲のコードは、呼び出しスタックや最初に呼び出される方法ほど重要ではありません。説明が難しい場合は、誤解を防ぎ、問題をさらに診断するためにコールスタックを追加するか、特定の状況でSTAスレッドを開始する方法を説明する必要があります。

于 2009-11-09T08:21:06.303 に答える
1

あなたのコードは、バックグラウンド スレッドから xps ドキュメントにアクセスしようとしていますか? このような場合は、ディスパッチャを使用する必要があります。その情報はこちら

これで問題が解決しない場合は、実際に GetFixedDocumentSequence() を呼び出しているコードを投稿していただけますか?

于 2009-11-09T05:14:55.540 に答える