2014-09-12 99 views
1

我使用DocumentPaginator将FlowDocument的文本分成页面。在ComputePageCount()之后,是否可以通过页码获取每个页面的内容?如果没有,我怎么能用其他方式做到这一点?在WPF中可以通过页码获取每个DocumentPage的内容吗?

代码:

var flowDocument = this.Document; 
flowDocument.MaxPageHeight = this.MaxContentHeight; 
DocumentPaginator paginator = ((IDocumentPaginatorSource)flowDocument).DocumentPaginator; 
paginator.ComputePageCount(); 

回答

2

是的,这是可能的。

下面是一个例子:

MainWindow.xaml

<Window x:Class="WpfApplication.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <DockPanel> 
     <TextBlock x:Name="outputTextBlock" DockPanel.Dock="Bottom"/> 
     <FlowDocumentPageViewer> 
      <FlowDocument x:Name="flowDocument" Loaded="OnFlowDocumentLoaded"> 
       <Paragraph>First page</Paragraph> 
       <Paragraph BreakPageBefore="True">Second page</Paragraph> 
       <Paragraph BreakPageBefore="True">Third page</Paragraph> 
      </FlowDocument> 
     </FlowDocumentPageViewer> 
    </DockPanel> 
</Window> 

MainWindow.xaml.cs

using System.Text; 
using System.Windows; 
using System.Windows.Documents; 

namespace WpfApplication 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void OnFlowDocumentLoaded(object sender, RoutedEventArgs e) 
     { 
      var paginator = (DynamicDocumentPaginator)((IDocumentPaginatorSource)this.flowDocument).DocumentPaginator; 

      var text = new StringBuilder(); 

      for (int pageNumber = 0; ; ++pageNumber) 
       using(var page = paginator.GetPage(pageNumber)) 
       using (var nextPage = paginator.GetPage(pageNumber + 1)) 
       { 
        if (page == DocumentPage.Missing) 
         break; 

        var startPosition = (TextPointer)paginator.GetPagePosition(page); 
        var endPosition = nextPage == DocumentPage.Missing ? this.flowDocument.ContentEnd : (TextPointer)paginator.GetPagePosition(nextPage); 

        var range = new TextRange(startPosition, endPosition); 

        text.AppendFormat("Page {0}:", pageNumber + 1).AppendLine(); 
        text.AppendLine(range.Text); 
       } 

      this.outputTextBlock.Text = text.ToString(); 
     } 
    } 
} 
相关问题