2009-08-12 4 views
5

J'ai un FlowDocument qui varie en hauteur en raison d'un ItemsControl dans un BlockUIContainer. Dans certains cas, ItemsControl s'étend au-delà de la hauteur de la page. Existe-t-il un moyen d'adapter le FlowDocument à une page (8,5 "X 11") juste avant l'impression si nécessaire?Échelle de FlowFocument WPF pour s'adapter Page

En ce moment, le FlowDocument est nommé « doc » et la méthode pour l'impression que je utilise est:

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

Avez-vous trouvé une solution à ce problème? –

+0

Non, je ne l'ai toujours pas. J'ai dû m'installer et placer un emballage à l'intérieur du contrôle des articles, ce que je voulais éviter dès le départ. – Johnathan1

Répondre

3

Je sais qu'il est un peu tard, mais voici la solution que je suis venu avec. D'abord, nous créons un wrapper qui va générer les pages du document pour nous. Chaque page aura une transformation d'échelle qui lui est appliquée avant de le renvoyer.

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

Son utilisation est assez simple:

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

Si vous êtes intéressé, voici comment nous avons déterminé l'échelle. Dans notre cas, le document a été étendu au-delà de la largeur de la page, mais il peut facilement être modifié pour s'adapter à la hauteur de la page.

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; 
     } 
    } 
Questions connexes