2009-08-12 7 views
5

BlockUIContainer의 ItemsControl로 인해 높이가 다른 FlowDocument가 있습니다. 어떤 경우에는 ItemsControl이 페이지 높이를 초과하여 확장됩니다. 필요한 경우 인쇄 직전에 페이지 (8.5 "X 11")에 맞게 FlowDocument를 확장하는 방법이 있습니까?WPF FlowDocument 크기에 맞추기 페이지에

은 지금 현재로, FlowDocument는 '문서'라는 이름과 내가 사용하고 인쇄하는 방법은 다음과 같습니다

private void Print_Click(object sender, RoutedEventArgs e) 
    { 

     PrintDialog pd = new PrintDialog(); 
     doc.PageHeight = pd.PrintableAreaHeight; 
     doc.PageWidth = pd.PrintableAreaWidth; 
     doc.ColumnGap = 0; 
     doc.ColumnWidth = pd.PrintableAreaWidth; 
     IDocumentPaginatorSource dps = doc; 
     pd.PrintDocument(dps.DocumentPaginator, "Sheet"); 
    } 
+0

이 문제에 대한 해결책을 찾았습니까? –

+0

아니요 아직 안 됐습니다. 나는 정착해야했고 itemsControl 안에 wrappanel을 넣어야했다. 이것은 처음부터하지 않기를 바랬다. – Johnathan1

답변

3

나는 조금 늦게,하지만 여기에 내가 생각 해낸 해결책 알고있다.

먼저 우리를 위해 문서 페이지를 생성 할 래퍼를 만듭니다. 반환하기 전에 각 페이지에 스케일 변환이 적용됩니다. 당신이 관심이 있다면, 여기

private void PrintDocument(PrintDialog pd, FlowDocument document, double scale, string title) 
    { 
     DocumentPaginator dp = ((IDocumentPaginatorSource)document).DocumentPaginator; 
     FittedDocumentPaginator fdp = new FittedDocumentPaginator(dp, scale); 

     pd.PrintDocument(fdp, title); 
    } 

우리는 규모를 결정하는 방법이다 : 그것을 사용

public class FittedDocumentPaginator : DocumentPaginator 
{ 
    public DocumentPaginator Base { get; private set; } 
    public double Scale { get; private set; } 
    private readonly ScaleTransform _sTransform; 

    public FittedDocumentPaginator(DocumentPaginator baseDp, double scale) 
    { 
     if (baseDp == null) 
      throw new ArgumentNullException("baseDp"); 

     Base = baseDp; 
     Scale = scale; 
     _sTransform = new ScaleTransform(scale, scale); 
    } 

    public override DocumentPage GetPage(int pageNumber) 
    { 
     var page = Base.GetPage(pageNumber); 
     ((ContainerVisual)page.Visual).Transform = _sTransform; 

     return page; 
    } 

    public override bool IsPageCountValid 
    { 
     get { return Base.IsPageCountValid; } 
    } 

    public override int PageCount 
    { 
     get { return Base.PageCount; } 
    } 

    public override Size PageSize 
    { 
     get { return Base.PageSize; } 
     set { Base.PageSize = value; } 
    } 

    public override IDocumentPaginatorSource Source 
    { 
     get { return Base.Source; } 
    } 
} 

은 매우 간단합니다. 우리의 경우, 문서는 페이지 너비를 넘어서 확장되었지만 페이지 높이를 수용하도록 쉽게 수정할 수 있습니다.

private void Print(FlowDocument document, string title, double documentWidth) 
    { 
     var pd = new PrintDialog(); 

     if (pd.ShowDialog() == true) 
     { 
      // Set the printing margins. 
      Thickness pageMargins = document.PagePadding; 
      document.PagePadding = new Thickness(15.0); 

      // In our case, the document's width is NaN so we have to navigate the visual tree to get the ActualWidth, which is represented by 'documentWidth'. 
      double scale = documentWidth/pd.PrintableAreaWidth; 

      if (scale < 1.0) 
      { 
       // The report fits on the page just fine. Don't scale. 
       scale = 1.0; 
      } 

      double invScale = 1/scale; 

      document.PageHeight = pd.PrintableAreaHeight * scale; 
      document.PageWidth = pd.PrintableAreaWidth * scale; 

      DocumentPaginator dp = ((IDocumentPaginatorSource)document).DocumentPaginator; 
      FittedDocumentPaginator fdp = new FittedDocumentPaginator(dp, invScale); 

      pd.PrintDocument(fdp, title); 

      // Restore the original values so the GUI isn't altered. 
      document.PageHeight = Double.NaN; 
      document.PageWidth = Double.NaN; 
      document.PagePadding = pageMargins; 
     } 
    } 
관련 문제