2

目前,我能够打印正确缩放的单页以适合我正在打印的用户控件。但是,用户控件的大小超过了页面大小,我需要它来打印另一个页面,其中包含用户控件的剩余部分。任何想法如何去做?我已经研究过打印固定文档或将视觉效果转储到位图并将其切割。

 private void Print( Visual v )
        {

            System.Windows.FrameworkElement e = v as System.Windows.FrameworkElement;
            if( e == null )
                return;

            PrintDialog pd = new PrintDialog();
            if( pd.ShowDialog() == true )
            {
                //store original scale
                Transform originalScale = e.LayoutTransform;
                //get selected printer capabilities
                System.Printing.PrintCapabilities capabilities = pd.PrintQueue.GetPrintCapabilities( pd.PrintTicket );

                //get scale of the print wrt to screen of WPF visual
                double scaley = Math.Min( capabilities.PageImageableArea.ExtentWidth / e.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                               e.ActualHeight );

                double scalex = Math.Max( capabilities.PageImageableArea.ExtentWidth / e.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                              e.ActualHeight );
                //Transform the Visual to scale
                e.LayoutTransform = new ScaleTransform( 0.2823293807641634 + 0.2498215560314061, 0.2823293807641634 + 0.2498215560314061 );

                //get the size of the printer page
                System.Windows.Size sz = new System.Windows.Size( capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight );

                //update the layout of the visual to the printer page size.
                e.Measure( sz );
                e.Arrange( new System.Windows.Rect( new System.Windows.Point( capabilities.PageImageableArea.OriginWidth, capabilities.PageImageableArea.OriginHeight ), sz ) );

                //now print the visual to printer to fit on the one page.
                pd.PrintVisual( v, "My Print" );


                //apply the original transform.
                e.LayoutTransform = originalScale;
            }
        }

        private void UserControl_Loaded( object sender, RoutedEventArgs e )
        {
  Print( this.gdOuterReport );
        }
4

0 回答 0