WPF Printing to fit page

前端 未结 2 595
暗喜
暗喜 2020-12-15 01:36

i searched for options how to print WPF controls and found some solutions. I do need to fit my printed control to printing page while preserving aspect ration (my control is

2条回答
  •  独厮守ぢ
    2020-12-15 02:19

    I know this question is quite old but looking for a solution to this problem myself. Here is the solution I am currently using. I store the original transformation against the framework element and then reapply it after the printing has finished.

        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 scale = Math.Min(capabilities.PageImageableArea.ExtentWidth / e.ActualWidth, capabilities.PageImageableArea.ExtentHeight /
                               e.ActualHeight);
    
                //Transform the Visual to scale
                e.LayoutTransform = new ScaleTransform(scale, scale);
    
                //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;
            }
        }
    

提交回复
热议问题