WPF截图操作及避坑指南

WPF截图操作及避坑指南

使用要求

  1. 对一个控件进行截图,需要该控件位于一个容器控件中(如Gird或StackPanel中)。
  2. 截图时会将要截图对象在界面上渲染的结果进行截图,包括位于该空间上的其他元素。比如一张图片Image上面有一个按钮,对Image进行截图,会将按钮一并截取。
  3. 如果想只截取需要截取的控件,而不受到在渲染其上的其他控件的影响,可以创建一个的Viewbox(不将其添加到界面上),将需要截图的元素与其父元素断开连接,并添加到Viewbox中,此时可以进行截图。截图之后将截图的元素重新放置到原来的父元素中。

核心函数

		//Png可以改成其它格式,如Jpeg
        public static void SaveToPng(FrameworkElement visual, string fileName)
        {
            var encoder = new PngBitmapEncoder();
            var bitmap = new RenderTargetBitmap((int)visual.ActualWidth, (int)visual.ActualHeight, 96, 96, PixelFormats.Pbgra32);
            bitmap.Render(visual);
            var frame = BitmapFrame.Create(bitmap);
            encoder.Frames.Add(frame);
            using (var stream = File.Create(fileName)) encoder.Save(stream);


            encoder = null;
            bitmap = null;
            frame = null;
        }

使用方法:

			//这里是将一个图表控件截图到文件
            var parent = (Panel)chart.Parent;

            parent.Children.Remove(chart);

            var viewbox = new Viewbox();
            viewbox.Child = chart;
            viewbox.Measure(chart.RenderSize);
            viewbox.Arrange(new Rect(new Point(0, 0), chart.RenderSize));
            viewbox.UpdateLayout();

            Capture.SvToPng(chart, fileName);

            viewbox.Child = null;

            parent.Children.Add(chart);

你可能感兴趣的:(wpf)