2009-08-12 17 views
5

Ich habe ein FlowDocument, das in der Höhe aufgrund eines ItemsControl in einem BlockUIContainer variiert. In einigen Fällen erstreckt sich das ItemsControl über die Seitenhöhe hinaus. Gibt es eine Möglichkeit, das FlowDocument direkt vor dem Drucken auf eine Seite (8,5 "x 11") zu skalieren, falls erforderlich?WPF FlowDocument Scale zum Anpassen der Seite

Ab jetzt wird das Flowdocument ‚doc‘ genannt und das Verfahren zum Drucken Ich benutze ist:

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

Haben Sie eine Lösung für dieses Problem gefunden? –

+0

Nein, habe ich immer noch nicht. Ich musste mich niederlassen und ein Wrappel in die Steuerung legen, was ich von Anfang an vermeiden wollte. – Johnathan1

Antwort

3

Ich weiß, es ist ein bisschen spät, aber hier ist die Lösung kam ich mit.

Zuerst erstellen wir einen Wrapper, der die Dokumentseiten für uns generiert. Auf jede Seite wird eine Skalierungstransformation angewendet, bevor sie zurückgegeben wird.

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

es zu verwenden ist ziemlich einfach:

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

Wenn Sie interessiert sind, hier ist, wie wir die Skala bestimmt. In unserem Fall wurde das Dokument über die Seitenbreite hinaus erweitert, aber es kann leicht geändert werden, um die Seitenhöhe anzupassen.

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