Пустые страницы при реализации DocumentPaginator

#c# #wpf #xps #xpsdocument #documentpaginator

#c# #wpf #xps #xpsdocument #documentpaginator

Вопрос:

Я пытаюсь реализовать такой пагинатор:

 public class MyPaginator : DocumentPaginator{

  // ommitting details...

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

Он компилируется, запускается, но страница остается пустой (белой). «холст» является экземпляром System .Windows.Элементы управления.Холст.

Когда я помещаю его в экранный контейнер, такой как ScrollViewer, он отлично отображается.

 XpsDocument _xpsDocument = CreateXpsDoc(myPaginatorInstance);
  

Единственное, что работает, это то, что размер страницы устанавливается на размер холста. Чего мне не хватает?

Ответ №1:

Я отвечу на свое собственное перекати-поле (снова):

 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);
}
  

Комментарии:

1. Спасибо, Луи! У меня были процедуры для рендеринга страниц в PDF с использованием pdfsharp и для создания предварительного просмотра определенной страницы на основе wpf, но как получить тот же код, который сгенерировал предварительный просмотр страницы в формате wpf, для создания фактического вывода для принтера с надлежащим масштабированием, было далеко не ясно.

2. @Louis Somers что canvas в этом примере?

3. @theycallmemorty Как указано в моем вопросе (выше моего ответа), это экземпляр System . Windows. Элементы управления. Холст , который, конечно, заполнен дочерними элементами управления, которые вместе образуют макет страницы. Использование Canvas удобно в контексте фиксированной разметки страницы, с элементами дизайна в фиксированных положениях. Он имеет «абсолютное позиционирование дочернего содержимого» и, следовательно, не будет пытаться масштабировать, перемещать или перенаправлять содержимое в соответствии с какими-либо ограничениями. Дочерние элементы остаются точно там, где помещены.