Как получить доступ к отдельным элементам пользовательского интерфейса WPF, сгенерированным потоком, из потока Dispatcher?

Мне нужно сгенерировать предварительный просмотр печати (длинный )с использованием элементов пользовательского интерфейса wpf, таких как FixedDocument, FlowDocument, PageContent, BlockUIContainer и т. д. Чтобы мой пользовательский интерфейс оставался отзывчивым, я делаю эту часть в отдельном потоке класса Thread (. BackgroundWorker не будет работать, так как мне нужен поток STA ). Все в порядке до этого момента.
Но после отображения предварительного просмотра печати теперь мне нужно распечатать, и нажатие значка «Печать» в сгенерированном предварительном просмотре вызывает печально известную «Вызывающий поток не может получить доступ к этому объекту, потому что им владеет другой поток». исключение. Итак, есть ли обходной путь?

РЕДАКТИРОВАТЬ (КОД):

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 ()генерирует предварительный просмотр для печати (, который содержит элементы пользовательского интерфейса )и заполняет их данными отчета. 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>`
5
задан ThinkingStiff 1 August 2012 в 19:01
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: