樣本程式可以根據使用者定義的大小,將一個文字檔分頁顯示。
這要得益於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