我们从XPS文档加载FixedPage对象,处理并显示它。以下代码从包中加载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),有时会阻止UI。我们可以使用它自己的Dispatcher在另一个线程中执行此操作,但由于FixedPage类不可解析,因此主UI线程无法使用它。
有解决方法吗?现在我们使用RenderTargetBitmap将FixedPages渲染为图像,因为BitmapSource是Freezable。
答案 0 :(得分:-1)
首先将xaml加载到内存流中,然后将内存流传递给UI线程。解析UI线程上的内存流。这样你就可以在后台线程上执行慢速文件IO。只有内存解析流(使用XamlReader.Load)才能在UI线程上完成。
这artice解释了如何做到这一点。