FixedDocument、FlowDocument、PageContent、BlockUIContainerなどのwpf UI要素を使用して印刷プレビュー(長いもの)を生成する必要があります。UIの応答性を維持するために、この部分を別のThreadクラススレッドで実行しています(STAスレッドが必要なため、BackgroundWorkerは機能しません)。この時点まではすべてOKです。
しかし、印刷プレビューを表示した後、印刷する必要があります。生成されたプレビューの[印刷]アイコンをクリックすると、悪名高い「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」がスローされます。例外。それで、回避する方法はありますか?
編集(コード):
Dispatcher.CurrentDispatcher.Invoke(new Action(() =>
{
Thread thread = new Thread(() =>
{
FixedDocument document = renderFlowDocumentTemplate(report);
PrintPreview preview = new PrintPreview();
preview.WindowState = WindowState.Normal;
preview.documentViewer.Document = document;
preview.ShowDialog();
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}));`
ここで、RenderFlowDocumentTemplate()は印刷プレビュー(UI要素を含む)を生成し、それらにレポートデータを入力します。PrintPreviewは、プレビューを実際に保持および表示するDocumentViewer要素を含むカスタムウィンドウであり、クリックするとPrintDialogウィンドウを表示するための印刷アイコンが含まれます。
編集(XAML):
<cw:CustomWindow x:Class="MyApp.Reports.PrintPreview"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cw="clr-namespace:MyApp.UI.CustomWindows;assembly=MyApp.UI.CustomWindows">
<DocumentViewer Margin="0,30,0,0" Name="documentViewer"></DocumentViewer>
</cw:CustomWindow>`