捕获/快照当前的WPF内容窗口并将其发送到C#VS 2008中的默认打印机

时间:2017-11-06 16:01:08

标签: c# wpf printing visual-studio-2008 screen-capture

我有一个MVVM WPF应用程序。

我正在尝试捕获窗口的当前内容,而不使用Window Form Header和Window Form边框。

我知道在Windows窗体应用程序中这很容易,here就是一个例子。

我想在我的WPF应用程序中执行相同的操作,但我很遗憾。我找到了一个示例here,但它捕获了所有屏幕。

我该怎么做?此外,一旦捕获,我需要直接发送它以打印到默认打印机。

所以我试图做以下事情但没有成功:

  1. 捕获WPF窗口内容,不带窗口窗体标题和窗口窗体边框。
  2. 将此屏幕捕获打印到默认打印机,而不显示任何打印对话框。
  3. ATTEMPT#1 - 问题1 - 捕获屏幕: 关于第1点(捕获窗口的内容),我在下面做了。 SnapShotPNG解决方案运行良好。

    GetSnapshotButton_Click中的TopGrid UI元素是我想要对其内容进行快照的网格。

    GetJpgImage解决方案根本不起作用。在快照中出现黑色区域​​。为什么呢?

    herehere中提取的解决方案。

        private void GetSnapshotButton_Click(object sender, RoutedEventArgs e)
        {
            var uri = new System.Uri("c:\\Temp\\capture1.png");            
            SnapShotPNG(TopGrid, uri, 1);
    
            uri = new System.Uri("c:\\Temp\\capture2.jpg");
            GetJpgImage(TopGrid, uri, 1, 100);
        }
    
        public void SnapShotPNG(UIElement source, Uri destination, int scale)
        {
            try
            {
                double actualHeight = source.RenderSize.Height;
                double actualWidth = source.RenderSize.Width;
    
                double renderHeight = actualHeight * scale;
                double renderWidth = actualWidth * scale;
    
                RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
                VisualBrush sourceBrush = new VisualBrush(source);
    
                DrawingVisual drawingVisual = new DrawingVisual();
                DrawingContext drawingContext = drawingVisual.RenderOpen();
    
                using (drawingContext)
                {
                    drawingContext.PushTransform(new ScaleTransform(scale, scale));
                    drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
                }
                renderTarget.Render(drawingVisual);
    
                PngBitmapEncoder encoder = new PngBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
                {
                    encoder.Save(stream);
                }
            }
            catch (Exception e)
            {
                //MessageBox.Show(e);
            }
        }
    
        ///
        /// Gets a JPG "screenshot" of the current UIElement
        ///
        /// UIElement to screenshot
        /// Scale to render the screenshot
        /// JPG Quality
        /// Byte array of JPG data
        public void GetJpgImage(UIElement source, Uri destination, double scale, int quality)
        {
            double actualHeight = source.RenderSize.Height;
            double actualWidth = source.RenderSize.Width;
    
            double renderHeight = actualHeight * scale;
            double renderWidth = actualWidth * scale;
    
            RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
            VisualBrush sourceBrush = new VisualBrush(source);
    
            DrawingVisual drawingVisual = new DrawingVisual();
            DrawingContext drawingContext = drawingVisual.RenderOpen();
    
            using (drawingContext)
            {
                drawingContext.PushTransform(new ScaleTransform(scale, scale));
                drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
            }
            renderTarget.Render(drawingVisual);
    
            JpegBitmapEncoder jpgEncoder = new JpegBitmapEncoder();
            jpgEncoder.QualityLevel = quality;
            jpgEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
    
            using (FileStream stream = new FileStream(destination.LocalPath, FileMode.Create, FileAccess.Write))
            {
                jpgEncoder.Save(stream);
            }
        }
    

    ATTEMPT#2 - 问题1 - 捕获屏幕: 使用Dymanoid解决方案有效,但有一个问题:内容不适合一页。我现在正试着融入一页。要将内容整合到一个页面中,我正在尝试执行here所解释的内容。

    用于打印网格效果(请参阅here):

    PrintDialog printDlg = new PrintDialog();
    printDlg.PrintVisual(TopGrid, "Grid Printing.");
    

    用于打印整个wpf窗口(参见here):

    PrintDialog printDlg = new PrintDialog();
    printDlg.PrintVisual(this, "Window Printing.");
    

0 个答案:

没有答案