我们目前正在使用WPF创建一个多页发票凭证,然后通过XPS打印/导出。
我们为实现这一目标而采取的路线是创建一个包含显示发票行的标准ListBox等的UserControl,然后将其包含在BlockUIContainer标签内的FlowDocument中。
当此FlowDocument放置在窗口中的FlowDocumentScrollViewer标记内时,它可以正常工作,UserControl的数据绑定内容可以正常显示。但是,当我们尝试在代码中创建相同的FlowDocument时,它会失败并显示“'无法创建未知类型'{clr-namespace:FOO} FooUserControl”XamlParseException。如果删除了UserControl,则可以通过编程方式成功创建FlowDocument。
这是FlowDocument XAML:
<FlowDocument xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:local="clr-namespace:MARS"
ColumnWidth="400" FontSize="14" FontFamily="Georgia">
<Paragraph>
Blah
</Paragraph>
<BlockUIContainer>
<local:printTestUserControl></local:printTestUserControl>
</BlockUIContainer>
这是我们用来在代码中创建它的代码:
FileStream xamlFile = new FileStream("printTestFlowDoc.xaml", FileMode.Open, FileAccess.Read);
FlowDocument content = (FlowDocument)XamlReader.Load(xamlFile);
flowDocScrollViewer.Document = content;
xamlFile.Close();
我们在代码中创建FlowDocument的原因是然后使用Paginator对象将其分割成一系列FixedDocuments然后打印/导出到XPS,我们还没有尝试过,但是我从到目前为止,看起来这似乎是一种在WPF中实现多页文档打印的可行方法(文档在第一页上有标题,最后一页有总页脚,中间有x页行)。
对此问题的任何建议或其他方法都非常受欢迎。
这些链接是我们从目前为止获取的一些信息,但遗憾的是还不够! (我会在评论中包含其他链接,因为StackOverflow目前不信任我有多个链接!)
See the section "Dynamically Creating a FlowDocument, Data Binding and Printing It" Scott Hanselmann似乎遇到了和我们一样的问题,但添加了这行
Dispatcher.CurrentDispatcher.Invoke(DispatcherPriority.SystemIdle, new DispatcherOperationCallback(delegate { return null; }), null);
没有加载我们的FlowDocument,但他只是在他的FlowDocument中绑定到TextBlocks,而不是包含UserControl。
非常感谢您阅读这篇文章!以及任何人都可以提供的任何帮助。
答案 0 :(得分:0)
对不起,我整理这个问题的速度很慢,但我们刚刚完成了这个项目,现在我正在整理它的所有松散的目标。
事实证明,flowdocument / XPS方法是一种完全错误的方式来处理这项任务,事实上,内置的RDLC报告使我们能够以相对直接的方式实现发票文件所需的一切。
这方面的主要好处是我们能够报告我们的业务模型对象的内存中实例,而不是必须通过从crystal调用的存储过程来使用从db查找的数据,而以前的系统依赖于根据。 VS中的报表文件编辑器很容易掌握,如果在布置复杂报表时有时会有点恼火。
希望在WPF应用程序报告时,考虑到他们的选择,这可能会有所帮助。