示例程序可以根据用户定义的大小,将一个文本文件分页显示。

这要得益于FlowDocument中的分页器(DocumentPaginator)。WPF中的FlowDocument,FixedDocument和FixedDocumentSequence都有自己的分页器。他们都继承与IDocumentPaginatorSource接口,这个借口则返回一个分页器对象DocumentPaginator。

FixedDocument和FixedDocumentSequence使用分页器很好理解,因为他们本身就要按固定页面大小显示。而FlowDocument虽然是流动的,但是某些控件FlowDocumentReader或者FlowDocumentPageViewer可以将他们按页显示,此时则用到FlowDocument的分页器(DocumentPaginator)。那么既然WPF内部控件可以使用,我们也可以自己使用。
具体步骤如下:
- 通过PageWidth和PageHeight属性设置FlowDocument大小
- 通过IDocumentPaginatorSource获取DocumentPaginator
- 通过DocumentPaginator.ComputePageCount计算总页数
- 获取所有页面的DocumentPage对象
- 通过DocumentPage.Visual和VisualBrush将页面内容反映到界面上
当然,本例中,得先将TXT文本转换成FlowDocument(将Run加入Paragraph中,然后将Paragraph加入FlowDocument中的Blocks属性中)。
主要逻辑代码:
UIElement[] PageFlowDoc(FlowDocument fdoc, double width, double height)
{
//设置FlowDocument大小
fdoc.PageWidth = width;
fdoc.PageHeight = height;
//获取分页器
var paginator = ((IDocumentPaginatorSource)fdoc).DocumentPaginator;
//计算总页数
paginator.ComputePageCount();
var elements = new UIElement[paginator.PageCount];
//获取页面
for (int i = 0; i < elements.Length; i++)
{
var grid = new Grid();
grid.Width = width;
grid.Height = height;
var visual = paginator.GetPage(i).Visual;
var visualBrush = new VisualBrush(visual);
grid.Background = visualBrush;
elements[i] = grid;
}
return elements;
}
源代码下载
下载地址
注意:此为微软SkyDrive存档,请用浏览器直接下载,用某些下载工具可能无法下载
源代码环境:Visual Studio 2010
:D