我在将FlowDocument保存为XPS文档时遇到了一些困难,无法显示其中包含的图像。
我的操作步骤如下:
1.使用WPF的Image控件创建图像。我在调用BeginInit/EndInit之间设置图像源。
2.将图像添加到FlowDocument中并将其包装在BlockUIContainer中。
3.使用修改过的此代码将FlowDocument对象保存为XPS文件。
如果我使用XPS查看器查看保存的文件,则图像不会显示。问题在于,图片直到由WPF在屏幕上实际显示时才被加载,因此它们不会保存到XPS文件中。因此,有一个解决方法:如果我首先使用FlowDocumentPageViewer将文档显示在屏幕上,然后再保存XPS文件,那么图像就会被加载并显示在XPS文件中。即使FlowDocumentPageViewer被隐藏,这也可以工作。但这给我带来了另一个挑战。以下是我希望做的(伪代码):
当然,这种方法行不通,因为在将文档保存到XPS文件之前,FlowDocumentPageViewer永远没有机会显示其内容。我尝试使用Dispatcher.BeginInvoke将SaveFlowDocumentToXpsFile包装起来,但没有帮助。
我的问题是:
我的操作步骤如下:
1.使用WPF的Image控件创建图像。我在调用BeginInit/EndInit之间设置图像源。
2.将图像添加到FlowDocument中并将其包装在BlockUIContainer中。
3.使用修改过的此代码将FlowDocument对象保存为XPS文件。
如果我使用XPS查看器查看保存的文件,则图像不会显示。问题在于,图片直到由WPF在屏幕上实际显示时才被加载,因此它们不会保存到XPS文件中。因此,有一个解决方法:如果我首先使用FlowDocumentPageViewer将文档显示在屏幕上,然后再保存XPS文件,那么图像就会被加载并显示在XPS文件中。即使FlowDocumentPageViewer被隐藏,这也可以工作。但这给我带来了另一个挑战。以下是我希望做的(伪代码):
void SaveDocument()
{
AddFlowDocumentToFlowDocumentPageViewer();
SaveFlowDocumentToXpsFile();
}
当然,这种方法行不通,因为在将文档保存到XPS文件之前,FlowDocumentPageViewer永远没有机会显示其内容。我尝试使用Dispatcher.BeginInvoke将SaveFlowDocumentToXpsFile包装起来,但没有帮助。
我的问题是:
- 是否可以在不实际显示文档的情况下强制加载图像以在保存XPS文件之前加载它们?(我尝试了调整BitmapImage.CreateOptions,但没有成功)。
- 如果问题#1没有解决方案,是否有一种方法可以告诉FlowDocumentPageViewer何时完成加载其内容,以便我知道何时创建XPS文件是安全的?
ContextualLayoutManager
遍历逻辑树的解决方案。如果它有效,我会告诉你。否则,我将采用像你所做的那样在查看器中加载文档,但是我会将窗口位置设置为X:10,000 Y:10,000,以便用户看不到它。 - Dennis