2011-02-24 69 views
5

如何讓FixedDocument自動分頁?我可以使用下面的代碼將美化面板放入DocViewer中。當面板延伸到單個頁面時會出現問題。現在,我們簡單地剪輯。基本上,我想創建一個相當通用的方式來打印用戶正在查看的內容。我的方法合理嗎?WPF固定文檔分頁

public void CreateReport(Panel details) 
    { 
     FixedDocument fixedDoc = new FixedDocument(); 
     PageContent pageContent = new PageContent(); 
     FixedPage fixedPage = new FixedPage(); 

     fixedPage.DataContext = this.DataContext; 
     fixedPage.Margin = new Thickness(10); 

     fixedPage.Children.Add(details); 
     ((System.Windows.Markup.IAddChild)pageContent).AddChild(fixedPage); 
     fixedDoc.Pages.Add(pageContent); 

     // This makes the array of controls invisibile, then climbs the details structure 
     // and makes the controls within details appropriate for the DocumentViewwer (i.e. TextBoxes are 
     // non-editable, no borders, no scroll bars, etc). 
     prePrintPrepare(details, fixedPage, new FrameworkElement[] { controlToMakeInvisible }); 

     _dv = new DocViewer(); 
     _dv.documentViewer1.Document = fixedDoc; 
     _dv.Show(); 
    } 

回答

3

我討厭回答我的問題,但是,下面給我一個合理的解決方案: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/bd89e0d2-73df-4b9b-9210-b8be83ff29d6/

斯科特

public static class PrintHelper 
{ 
    public static FixedDocument GetFixedDocument(FrameworkElement toPrint, PrintDialog printDialog) 
    { 
     PrintCapabilities capabilities = printDialog.PrintQueue.GetPrintCapabilities(printDialog.PrintTicket); 
     Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight); 
     Size visibleSize = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight); 
     FixedDocument fixedDoc = new FixedDocument(); 

     // If the toPrint visual is not displayed on screen we neeed to measure and arrange it. 
     toPrint.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
     toPrint.Arrange(new Rect(new Point(0, 0), toPrint.DesiredSize)); 

     Size size = toPrint.DesiredSize; 

     // Will assume for simplicity the control fits horizontally on the page. 
     double yOffset = 0; 
     while (yOffset < size.Height) 
     { 
      VisualBrush vb = new VisualBrush(toPrint); 
      vb.Stretch = Stretch.None; 
      vb.AlignmentX = AlignmentX.Left; 
      vb.AlignmentY = AlignmentY.Top; 
      vb.ViewboxUnits = BrushMappingMode.Absolute; 
      vb.TileMode = TileMode.None; 
      vb.Viewbox = new Rect(0, yOffset, visibleSize.Width, visibleSize.Height); 

      PageContent pageContent = new PageContent(); 
      FixedPage page = new FixedPage(); 
      ((IAddChild)pageContent).AddChild(page); 
      fixedDoc.Pages.Add(pageContent); 
      page.Width = pageSize.Width; 
      page.Height = pageSize.Height; 

      Canvas canvas = new Canvas(); 
      FixedPage.SetLeft(canvas, capabilities.PageImageableArea.OriginWidth); 
      FixedPage.SetTop(canvas, capabilities.PageImageableArea.OriginHeight); 
      canvas.Width = visibleSize.Width; 
      canvas.Height = visibleSize.Height; 
      canvas.Background = vb; 
      page.Children.Add(canvas); 

      yOffset += visibleSize.Height; 
     } 
     return fixedDoc; 
    } 

    public static void ShowPrintPreview(FixedDocument fixedDoc) 
    { 
     Window wnd = new Window(); 
     DocumentViewer viewer = new DocumentViewer(); 
     viewer.Document = fixedDoc; 
     wnd.Content = viewer; 
     wnd.ShowDialog(); 
    } 
} 
+0

這是偉大的!我想知道是否有可能在項目之間做一個分頁,而不是切入某些東西。 – BoomBaby 2018-02-21 03:20:32