Спасибо за это. Создание моего документа включает создание экземпляра FixedDocument, добавление объектов FixedPage, заполнение их элементами управления и т. Д. Поскольку FixedDocument является объектом DispatcherObject, я не смог создать его в фоновом потоке, а затем установить его в качестве источника для DocumentViewer, так как он также создал перекрестное нарушение. Я обнаружил, что должен создать свой документ в той же ветке, что и мой DocumentViewer, т. Е. В потоке пользовательского интерфейса :-( Но я нашел способ обойти мою проблему - я опубликую его сейчас.

м приложении WPF у меня есть особыйWindow который содержит, среди прочего,DocumentViewer.

Когда это окно открывается и загружается, оно динамически создаетFixedDocument с индикатором прогресса, а затем отображает его вDocumentViewer, Это работает, и для улучшения взаимодействия с пользователем я запускаю это окно в своем собственном потоке, так что главное окно приложения все еще реагирует во время создания документа.

Основано на подсказках вэта веб-страницаЯ открываю окно в новой теме, например:

public void ShowDocumentViewerWindow(params object[] data) {
    var thread = new Thread(() => {
        var window = new MyDocumentViewerWindow(new MyObject(data));
        window.Closed += (s, a) => window.Dispatcher.InvokeShutdown();
        window.Show();
        System.Windows.Threading.Dispatcher.Run();
    });
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

До сих пор я был доволен этой настройкой, но столкнулся с проблемой.

MyDocumentViewerWindow содержит кнопку печати, которая ссылается на встроенную команду Print, нацеленную на DocumentViewer:

<Button Command="Print" CommandTarget="{Binding ElementName=MyDocumentViewer}">Print</Button>

До того, как у меня было окно в отдельной ветке, это работало нормально. Но теперь, когда я нажимаю на него, приложение вылетает. Visual Studio 2010 выделяет следующую строку из приведенного выше кода в качестве места сбоя с сообщением «Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им.«:

System.Windows.Threading.Dispatcher.Run();

Трассировка стека начинается так:

at System.Windows.Threading.Dispatcher.VerifyAccess()
at MS.Internal.Printing.Win32PrintDialog.ShowDialog()
at System.Windows.Controls.PrintDialog.ShowDialog()
at System.Printing.PrintQueue.GatherDataFromPrintDialog(PrintDialog printDialog, XpsDocumentWriter&amp;amp; writer, PrintTicket&amp;amp; partialTrustPrintTicket, PrintQueue&amp;amp; partialTrustPrintQueue, Double&amp;amp; width, Double&amp;amp; height, String jobDescription)
at System.Printing.PrintQueue.CreateXpsDocumentWriter(String jobDescription, PrintDocumentImageableArea&amp;amp; documentImageableArea)
at System.Windows.Controls.Primitives.DocumentViewerBase.OnPrintCommand()
at System.Windows.Controls.Primitives.DocumentViewerBase.ExecutedRoutedEventHandler(Object target, ExecutedRoutedEventArgs args)
...

Я догадываюсь, что диалоговое окно печати открывается в главном потоке пользовательского интерфейса и пытается получить доступ к документу, созданному и принадлежащему моему собственному потоку, что приводит к сбою.

Любые идеи, как я могу решить это? Я хотел бы сохранить окно в своей собственной теме.

Ответы на вопрос(2)

Ваш ответ на вопрос