Мы загружаем объекты FixedPage из документа XPS, обрабатываем и отображаем его. Следующий код выполняет загрузку FixedPage из пакета:
FixedPage fp = null;
Package package; // xps package
Uri packageUri; // uri of the package in the package store
Uri fixedPageUri; // uri of the fixed page
Dispatcher _mainDispatcher // reference to the main dispatcher, passed to this function
// this function runs in a different thread
// get the fixed page stream
Stream stream = package.GetPart(fixedPageUri).GetStream();
// create a parser context to help XamlReader with the resources used in the page
ParserContext pc = new ParserContext();
pc.BaseUri = PackUriHelper.Create(packageUri, fixedPageUri);
_mainDispatcher.BeginInvoke(
new UIRenderDelegate(delegate()
{
// this line takes its sweet time
fp = XamlReader.Load(stream, pc) as FixedPage;
stream.Dispose();
}), null).Wait();
// return the created fixed page;
Однако этот вызов XamlReader.Load () занимает много времени (особенно для сложных FixedPages) и иногда блокирует пользовательский интерфейс. Мы могли бы сделать это в другом потоке с его собственным Dispatcher, но, поскольку класс FixedPage не доступен для freeazable, он не может использоваться основным потоком пользовательского интерфейса.
Есть ли способ обойти это? Сейчас мы застряли при рендеринге FixedPages в виде изображений с использованием RenderTargetBitmap, поскольку BitmapSource является Freezable.