Захват / снимок текущего окна содержимого WPF и отправка его на принтер по умолчанию в C# VS 2008

У меня есть приложение MVVM WPF.

Я пытаюсь захватить текущее содержимое окна без границ заголовка и оконной формы.

Я знаю, что это легко сделать в приложении Windows Forms, вот пример.

Я хотел бы сделать то же самое в моем приложении WPF, но я потерян. Я нашел пример здесь, но он захватывает весь экран.

Как я могу это сделать? Кроме того, после захвата мне нужно отправить его напрямую для печати на принтер по умолчанию.

Поэтому я пытаюсь сделать следующее без успеха:

  1. Захват содержимого окна WPF без границ заголовка и оконной формы.
  2. Распечатайте этот снимок экрана на принтере по умолчанию, не отображая диалоговое окно печати.

ПОПЫТКА № 1 - ВЫПУСК 1 - Экран захвата: Что касается пункта 1 (захват содержимого окна), который я сделал ниже. Решение SnapShotPNG работает отлично.

Элемент пользовательского интерфейса TopGrid в GetSnapshotButton_Click - это сетка, из которой я хочу сделать снимок его содержимого.

Решение GetJpgImage не работает вообще. На снимке появляются черные зоны. Зачем?

Решения извлечены отсюда и здесь.

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

ПОПЫТКА № 2 - ПРОБЛЕМА 1 - Экран захвата: использование решения Dymanoid работает, но с одной проблемой: содержимое не помещается на одной странице. Я пытаюсь сейчас вписаться в одну страницу. Чтобы разместить контент на одной странице, я пытаюсь сделать то, что объясняется здесь.

для печати сетки Cotent (см. здесь):

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

для печати всего окна wpf (см. здесь):

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

0 ответов

Другие вопросы по тегам