c# - 如何将 WPF ScrollViewer 的所有内容保存为图像

标签 c# wpf image

我有一个带有 ScrollViewer 控件的 WPF 窗口,其中包含许多垂直延伸的子控件。当用户单击位于 ScrollViewer 底部的按钮时,我希望将所有内容(当前可见和不可见)保存为图像。

我正在使用以下代码,我从展示如何保存窗口内容的示例中改编而来:

public static void SaveForm(ScrollViewer container, string filename)
{        
    const int dpi = 96;
    var rtb = new RenderTargetBitmap(
        (int)container.ExtentWidth, //width 
        (int)container.ExtentHeight, //height 
        dpi, //dpi x 
        dpi, //dpi y 
        PixelFormats.Pbgra32 // pixelformat 
        );

    rtb.Render(container);
    SaveRTBAsPNG(rtb, filename);
}

private static void SaveRTBAsPNG(RenderTargetBitmap bmp, string filename)
{
    var enc = new System.Windows.Media.Imaging.PngBitmapEncoder();
    enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp));

    using (var stm = System.IO.File.Create(filename))
    {
        enc.Save(stm);
    }
}

当前正在生成 PNG,但它只有 ScrollViewer 当前可见的部分。有什么方法可以让 PNG 包含所有内容,包括需要滚动到 View 中的内容?

最佳答案

将此与您的滚动查看器的CONTENT 作为源,而不是您的滚动查看器本身: (即使内容不可见,它也会拍摄快照)

    public static void SnapShotPNG(this UIElement source, Uri destination, int zoom)
    {
        try
        {
            double actualHeight = source.RenderSize.Height;
            double actualWidth = source.RenderSize.Width;

            double renderHeight = actualHeight * zoom;
            double renderWidth = actualWidth * zoom;

            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(zoom, zoom));
                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);
        }
    }

关于c# - 如何将 WPF ScrollViewer 的所有内容保存为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24934276/

相关文章:

c# - 标签页相关

c# - 是否有 IValueConverter 执行 if-then

c# - 以编程方式更改列表框项目背景颜色

c# - 转换后的 BitmapImage 未显示在页面上

c# - 有什么方法可以查看 C# 应用程序的泄漏内存?

c# - 如何获取 expando 对象的调用成员名称?

javascript - 解析TextArea中的文字并根据路径显示图片

html - 使 HTML 中的图像变大且不模糊

c# - 将图像复制到另一个文件夹

wpf - 启动画面关闭后将主窗口置于前面