Я пытаюсь предоставить предварительный просмотр документов XPS в реальном времени, не зависая в потоке пользовательского интерфейса. Открытие документа происходит достаточно быстро, но когда я вызываю GetFixedDocumentSequence(), мой пользовательский интерфейс перестает отвечать на запросы в течение нескольких секунд, а документ зависает.
// creating the doc is fine (0.005 seconds)
XpsDocument doc=new XpsDocument("BigFile.xps",FileAccess.Read);
// this hangs the UI for several seconds
FixedDocumentSequence seq=XpsDocument.GetFixedDocumentSequence();
// Once I have the sequence, GetPageAsync lets me pull out pages without breaking the UI
// ....
Очевидное решение — открыть документ в рабочем потоке, но FixedDocumentSequence привязан к создавшему его потоку, поэтому я не могу получить к нему доступ из потока пользовательского интерфейса, и если я попытаюсь вызвать GetPageAsync из рабочего потока, я получу исключение, потому что DocumentPages содержат визуальные элементы.
Единственное, о чем я могу думать, это создать документ в отдельном потоке пользовательского интерфейса, разбить документ на страницы, а затем сохранить эти страницы в виде файлов XPS, которые открывает поток пользовательского интерфейса. Но это кажется ужасно сложным решением. Кто-нибудь знает, есть ли альтернативный способ получения страниц документов, который не зависит от FixedDocumentSequence?