这要得益于FlowDocument中的分页器(DocumentPaginator)。WPF中的FlowDocument,FixedDocument和FixedDocumentSequence都有本身的分页器。他们都持续与IDocumentPaginatorSource接口,这个借口则返回一个分页器对象DocumentPaginator。
FixedDocument和FixedDocumentSequence应用分页器很好懂得,因为他们本身就要按固定页面大小显示。而FlowDocument固然是活动的,然则某些控件FlowDocumentReader或者FlowDocumentPageViewer可以将他们按页显示,此时则用到FlowDocument的分页器(DocumentPaginator)。那么既然WPF内部控件可以应用,我们也可以本身应用。
当然,本例中,得先将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];
 
            //获取页面
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i < elements.Length; i++)
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var grid = new Grid();
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; grid.Width = width;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; grid.Height = height;
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var visual = paginator.GetPage(i).Visual;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var visualBrush = new VisualBrush(visual);
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; grid.Background = visualBrush;
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; elements[i] = grid;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }
&#160;
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return elements;
&#160;&#160;&#160;&#160;&#160;&#160;&#160; }