Search code examples
c#wpfxpsxpsdocumentdocumentpaginator

Blank pages when implementing DocumentPaginator


I'm trying to implement a Paginator like this:

public class MyPaginator : DocumentPaginator{

  // ommitting details...

  public override DocumentPage GetPage(int pageNumber) {
    DocumentPage page = new DocumentPage(canvas);
    return page;
  }
}

It compiles, it runs, but the page is blank (white). the 'canvas' is an instance of System.Windows.Controls.Canvas.

When I put it in a on-screen container like ScrollViewer it renders perfectly.

XpsDocument _xpsDocument = CreateXpsDoc(myPaginatorInstance);

The only thing that is working is that the page's size is set to the size of the canvas. What am I missing?


Solution

  • I'll answer my own tumbleweed (again):

    public override DocumentPage GetPage(int pageNumber) {
      Canvas container = new Canvas();
      container.Children.Add(canvas);
      double scaleX = pageSize.Width / canvas.Width;
      double scaleY = pageSize.Height / canvas.Height;
      container.RenderTransform = new ScaleTransform(scaleX, scaleY);
    
      container.Width = PageSize.Width;
      container.Height = PageSize.Height;
      container.Measure(PageSize);
      container.Arrange(new Rect(new Point(0, 0), PageSize));
    
      Rect contentBox = new Rect(PageSize);
    
      return new DocumentPage(container, PageSize, contentBox, contentBox);
    }