【问题标题】:C# WPF - Print ScreenCapture of WPF WindowC# WPF - 打印 WPF 窗口的 ScreenCapture
【发布时间】:2016-02-26 10:37:35
【问题描述】:

有没有办法打印 wpf 窗口的屏幕截图?

我尝试了很多东西,但要么对于 A4 尺寸来说太大,要么因为没有设置边距而被裁剪。 这是我尝试过的代码:

样品1:

private void btnPrintStanzbild_Click(object sender, RoutedEventArgs e)
    {
        Visual target = gRight;

        Rect bounds = VisualTreeHelper.GetDescendantBounds(target);

        RenderTargetBitmap renderTarget = new RenderTargetBitmap((Int32)bounds.Width, (Int32)bounds.Height, 96, 96, PixelFormats.Pbgra32);

        DrawingVisual visual = new DrawingVisual();

        using (DrawingContext context = visual.RenderOpen())
        {
            VisualBrush visualBrush = new VisualBrush(target);
            context.DrawRectangle(visualBrush, null, new Rect(new Point(), bounds.Size));
        }

        renderTarget.Render(visual);
        PngBitmapEncoder bitmapEncoder = new PngBitmapEncoder();

        BitmapImage bi = new BitmapImage();


        bitmapEncoder.Frames.Add(BitmapFrame.Create(renderTarget));
        using (MemoryStream stm = new MemoryStream())
        {
            bitmapEncoder.Save(stm);
            bi.BeginInit();
            bi.CacheOption = BitmapCacheOption.OnLoad;
            bi.StreamSource = stm;
            bi.EndInit();
        }



        var vis = new DrawingVisual();
        var dc = vis.RenderOpen();
        dc.DrawImage(bi, new Rect { Width = bi.Width, Height = bi.Height });
        dc.Close();

        var pdialog = new PrintDialog();
        if (pdialog.ShowDialog() == true)
        {
            var queue = pdialog.PrintQueue;


            var area = queue.GetPrintCapabilities(pdialog.PrintTicket)
                            .PageImageableArea;

            pdialog.PrintVisual(vis, "My Image");
        }
    }

样本2:

PrintDialog pdialog = new PrintDialog();
        if (pdialog.ShowDialog() == true)
        {
            var queue = pdialog.PrintQueue;


            var area = queue.GetPrintCapabilities(pdialog.PrintTicket)
                            .PageImageableArea;

            pdialog.PrintVisual(this, "My Image");
        }

示例 3:

Link to sample 3

【问题讨论】:

  • 所以你想把窗口缩小到 A4 大小并打印出来?

标签: c# wpf printing window


【解决方案1】:
private void Print()
{
    PrintDialog pdialog = new PrintDialog();
    if (pdialog.ShowDialog() == true)
    {
        // Save current layout
        Transform origTransform = LayoutTransform;
        Size oldWindowSize = new Size(ActualWidth, ActualHeight);

        // Get printer caps
        PrintCapabilities capabilities = pdialog.PrintQueue.GetPrintCapabilities(pdialog.PrintTicket);

        // Get size of the printer page
        var sz = new Size(capabilities.PageImageableArea.ExtentWidth, capabilities.PageImageableArea.ExtentHeight);

        // Calculate zoom level of window
        double ratio = Math.Min(sz.Width / ActualWidth, sz.Height / ActualHeight);

        //if (ratio < 1) // Uncomment this line if you dont want zoom out small window
        {
            LayoutTransform = new ScaleTransform(ratio, ratio);
        }

        Measure(sz);
        Arrange(new Rect(new Point(0,0), sz));
        pdialog.PrintVisual(this, "My Image");

        // Store old layout
        LayoutTransform = origTransform;
        Measure(oldWindowSize);
        Arrange(new Rect(new Point(0, 0), oldWindowSize));
    }
}

【讨论】:

    猜你喜欢
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-05
    • 2015-08-05
    相关资源
    最近更新 更多